要求完成下面的表达式
a b c d e
+2 0 0 8 5
------------
f g h i j
其中2008表示2008年在北京举办奥运会,
5表示奥运五环,所以合起来20085刚好表示2008奥运。
要求abcdefghij分别表示从0到9的一位数字,而且 不允许重复使得上面的加法表达式成立.
/*- ==========================================================* 文件名 :YPR_20085_J.java* 开发人员:袁培荣* 当前版本:1.0.1.2595* 创建时间:2012-02-23* 修改时间:2012-02-23* 功能说明:2008奥运趣味题(单类单方法版)* 版权说明:版权所有 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版* JDK版本: JDK 7U3-B05(Windows-x64)- ==========================================================*//*- ==========================================================* 解题思路:* 设被加数为iAdd,最小值为01234.设和为iSum,最大值为98765* 则iAdd最大值为98765-20085=78680,从而取得iAdd取值范围* 对每一个iAdd,可知iSum=iAdd+20085* 将iAdd,iSum中每一位取出,放入一个一维十元素数组* 对数组进行是否有相当元素的鉴别,若没有,符合要求* 将符合要求的iAdd和iSum输出即可* 可能有多组解,不能得到一组就放弃循环,要循环完iAdd所有取值* 另外,20085中的两个0使得十位和百位相加时必须进位,则* iAdd的百位为9,这个结论可以减少程度的运算次数。- ==========================================================*/import java.io.*;public class YPR_20085_J{ public static void main(String args [ ]) { int iOK=0; //iOK用于记录解的个数 //变量的命名要尽量规范,这里采用匈牙利命名法,iOK中的i代表类型int int iAdd,iSum,iAtemp,iStemp; int iForNubmer[]=new int[10];//数组定义和C++不同 //JAVA中用new产生的东西不需要自行回收,JAVA后台会自动完成 int i,j; System.out.println("2008奥运趣味题的答案为:"); for(iAdd=1234;iAdd<=78680;iAdd++) { iSum=iAdd+20085; iAtemp=iAdd; iStemp=iSum; for(i=0;i<=4;i++) { iForNubmer[i]=iAtemp % 10; iAtemp=iAtemp/10; } if (iForNubmer[2]!=9) {continue;} for(j=0;j<=4;j++) { iForNubmer[j+5]=iStemp % 10; iStemp=iStemp/10; } boolean IsSame=false;//C++中布尔型为bool for(i=0;i<=8;i++) { for(j=i+1;j<=9;j++) { if (iForNubmer[i]==iForNubmer[j]) {IsSame=true;break;} } if (true==IsSame) //写成true==IsSame而非IsSame==true的好处是把==错写成=时,编译器会报错,容易查错 {break;} } if (false==IsSame) { System.out.println(iAdd+"+20085="+iSum); //用于运行结果1的输出 //System.out.println(" "+iAdd+'\n'+"+ 20085"+'\n'+"_______"+'\n'+" "+iSum); //System.out.println("=======================");//以上两行用于运行结果2的输出 iOK++; } } System.out.println("以上共有"+iOK+"组答案。"); }}//此处没有分号,C++中有,这是JAVA和C++的一个区别/*- 运行结果1=====================================================2008奥运趣味题的答案为:14982+20085=3506727951+20085=4803637941+20085=5802641973+20085=6205851963+20085=7204864932+20085=85017以上共有6组答案。=====运行结果2===================================================== 2008奥运趣味题的答案为: 14982+ 20085_______ 35067======================= 27951+ 20085_______ 48036======================= 37941+ 20085_______ 58026======================= 41973+ 20085_______ 62058======================= 51963+ 20085_______ 72048======================= 64932+ 20085_______ 85017=======================以上共有6组答案。- ==========================================================*/
/*- ==========================================================* 文件名 :YPR_20085.java* 开发人员:袁培荣* 当前版本:1.0.2.2595* 创建时间:2012-02-23* 修改时间:2012-02-23* 功能说明:2008奥运趣味题(单类多方法版)* 版权说明:版权所有 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版* JDK版本: JDK 7U3-B05(Windows-x64)- ==========================================================*//*- ==========================================================* 解题思路:* 设被加数为iAdd,最小值为01234.设和为iSum,最大值为98765* 则iAdd最大值为98765-20085=78680,从而取得iAdd取值范围* 对每一个iAdd,可知iSum=iAdd+20085* 将iAdd,iSum中每一位取出,放入一个一维十元素数组* 对数组进行是否有相当元素的鉴别,若没有,符合要求* 将符合要求的iAdd和iSum输出即可* 可能有多组解,不能得到一组就放弃循环,要循环完iAdd所有取值* 另外,20085中的两个0使得十位和百位相加时必须进位,则* iAdd的百位为9,这个结论可以减少程度的运算次数。- ==========================================================*/import java.io.*;public class YPR_20085{ static String sOut; public static void main(String args [ ]) { YPR_20085 m_ypr20085m=new YPR_20085();//类对象的创建和初始化与C++不同 //JAVA中用new产生的东西不需要自行回收,JAVA后台会自动完成 int iOKm=m_ypr20085m.ypr20085(); if (0==iOKm) //写成0==iOKm而非iOKm==0的好处是把==错写成=时,编译器会报错,容易查错 { System.out.println("对不起,2008奥运趣味题没有答案!"); } else { System.out.println("2008奥运趣味题的答案为:(共有"+iOKm+"组)"); System.out.println(sOut); } } public int ypr20085() { sOut=""; int iOK=0; //iOK用于记录解的个数 //变量的命名要尽量规范,这里采用匈牙利命名法,iOK中的i代表类型int int iAdd,iSum,iAtemp,iStemp; int iForNubmer[]=new int[10];//数组定义和C++不同 for(iAdd=1234;iAdd<=78680;iAdd++) { iSum=iAdd+20085; iAtemp=iAdd; iStemp=iSum; for(int i=0;i<=4;i++) { iForNubmer[i]=iAtemp % 10; iAtemp=iAtemp/10; } if (iForNubmer[2]!=9) {continue;} for(int j=0;j<=4;j++) { iForNubmer[j+5]=iStemp % 10; iStemp=iStemp/10; } YPR_20085 m_ypr20085=new YPR_20085(); boolean bIsSame_get=m_ypr20085.bIsSame(iForNubmer);//C++中布尔型为bool if (false==bIsSame_get) { sOut=sOut+iAdd+"+20085="+iSum+'\n'; //用于运行结果1的输出 //sOut=sOut+" "+iAdd+'\n'+"+ 20085"+'\n'+"_______"+'\n'+" "+iSum+'\n'; //sOut=sOut+"======================="+'\n'; //以上两行用于运行结果2的输出 iOK++; } } return iOK; } public boolean bIsSame(int iInt[]) //用于判断数组中有无相同元素 { int i,j; boolean IsSame=false; for(i=0;i<=8;i++) { for(j=i+1;j<=9;j++) { if (iInt[i]==iInt[j]) {IsSame=true;break;} } if (true==IsSame) {break;} } return IsSame; }}//此处没有分号,C++中有,这是JAVA和C++的一个区别/*- 运行结果1=====================================================2008奥运趣味题的答案为:(共有6组)14982+20085=3506727951+20085=4803637941+20085=5802641973+20085=6205851963+20085=7204864932+20085=85017=====运行结果2===================================================== 2008奥运趣味题的答案为:(共有6组) 14982+ 20085_______ 35067======================= 27951+ 20085_______ 48036======================= 37941+ 20085_______ 58026======================= 41973+ 20085_______ 62058======================= 51963+ 20085_______ 72048======================= 64932+ 20085_______ 85017=======================- ==========================================================*/
/*- ==========================================================* 文件名 :YPR_20085_m.java* 开发人员:袁培荣* 当前版本:1.0.3.2595* 创建时间:2012-02-23* 修改时间:2012-02-23* 功能说明:2008奥运趣味题(多类多方法版)* 版权说明:版权所有 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版* JDK版本: JDK 7U3-B05(Windows-x64)- ==========================================================*//*- ==========================================================* 解题思路:* 设被加数为iAdd,最小值为01234.设和为iSum,最大值为98765* 则iAdd最大值为98765-20085=78680,从而取得iAdd取值范围* 对每一个iAdd,可知iSum=iAdd+20085* 将iAdd,iSum中每一位取出,放入一个一维十元素数组* 对数组进行是否有相当元素的鉴别,若没有,符合要求* 将符合要求的iAdd和iSum输出即可* 可能有多组解,不能得到一组就放弃循环,要循环完iAdd所有取值* 另外,20085中的两个0使得十位和百位相加时必须进位,则* iAdd的百位为9,这个结论可以减少程度的运算次数。- ==========================================================*/import java.io.*;public class YPR_20085_m{ public static void main(String args [ ]) { YPR20085 m_ypr20085m=new YPR20085();//类对象的创建和初始化与C++不同 //JAVA中用new产生的东西不需要自行回收,JAVA后台会自动完成 int iOKm=m_ypr20085m.ypr20085(); if (0==iOKm) //写成0==iOKm而非iOKm==0的好处是把==错写成=时,编译器会报错,容易查错 { System.out.println("对不起,2008奥运趣味题没有答案!"); } else { System.out.println("2008奥运趣味题的答案为:(共有"+iOKm+"组)"); System.out.println(YPR20085.sOut); } }}//此处没有分号,C++中有,这是JAVA和C++的一个区别class YPR20085{ static String sOut; public int ypr20085() { sOut=""; int iOK=0; //iOK用于记录解的个数 //变量的命名要尽量规范,这里采用匈牙利命名法,iOK中的i代表类型int int iAdd,iSum,iAtemp,iStemp; int iForNubmer[]=new int[10];//数组定义和C++不同 for(iAdd=1234;iAdd<=78680;iAdd++) { iSum=iAdd+20085; iAtemp=iAdd; iStemp=iSum; for(int i=0;i<=4;i++) { iForNubmer[i]=iAtemp % 10; iAtemp=iAtemp/10; } if (iForNubmer[2]!=9) {continue;} for(int j=0;j<=4;j++) { iForNubmer[j+5]=iStemp % 10; iStemp=iStemp/10; } BISSAME m_ypr20085=new BISSAME(); boolean bIsSame_get=m_ypr20085.bIsSame(iForNubmer);//C++中布尔型为bool if (false==bIsSame_get) { sOut=sOut+iAdd+"+20085="+iSum+'\n'; //用于运行结果1的输出 //sOut=sOut+" "+iAdd+'\n'+"+ 20085"+'\n'+"_______"+'\n'+" "+iSum+'\n'; //sOut=sOut+"======================="+'\n'; //以上两行用于运行结果2的输出 iOK++; } } return iOK; }}//此处没有分号,C++中有,这是JAVA和C++的一个区别 class BISSAME{ public boolean bIsSame(int iInt []) //用于判断数组中有无相同元素 { int i,j; boolean IsSame=false; for(i=0;i<=8;i++) { for(j=i+1;j<=9;j++) { if (iInt[i]==iInt[j]) {IsSame=true;break;} } if (true==IsSame) {break;} } return IsSame; }}//此处没有分号,C++中有,这是JAVA和C++的一个区别/*- 运行结果1=====================================================2008奥运趣味题的答案为:(共有6组)14982+20085=3506727951+20085=4803637941+20085=5802641973+20085=6205851963+20085=7204864932+20085=85017=====运行结果2===================================================== 2008奥运趣味题的答案为:(共有6组) 14982+ 20085_______ 35067======================= 27951+ 20085_______ 48036======================= 37941+ 20085_______ 58026======================= 41973+ 20085_______ 62058======================= 51963+ 20085_______ 72048======================= 64932+ 20085_______ 85017=======================- ==========================================================*/
/*- ==========================================================* 文件名 :YPR_20085_cppJ.cpp* 开发人员:袁培荣* 当前版本:1.0.1.2595* 创建时间:2012-02-23* 修改时间:2012-02-23* 功能说明:2008奥运趣味题(C++单函数版)* 版权说明:版权所有 袁培荣 YuanPeirong * 编译环境:Windows 7(x64) SP1 简体中文专业版* 编译器: Visual Studio 2010 SP1 及 MinGW 2011118- ==========================================================*//*- ==========================================================* 解题思路:* 设被加数为iAdd,最小值为01234.设和为iSum,最大值为98765* 则iAdd最大值为98765-20085=78680,从而取得iAdd取值范围* 对每一个iAdd,可知iSum=iAdd+20085* 将iAdd,iSum中每一位取出,放入一个一维十元素数组* 对数组进行是否有相当元素的鉴别,若没有,符合要求* 将符合要求的iAdd和iSum输出即可* 可能有多组解,不能得到一组就放弃循环,要循环完iAdd所有取值* 另外,20085中的两个0使得十位和百位相加时必须进位,则* iAdd的百位为9,这个结论可以减少程度的运算次数。- ==========================================================*/#includeusing namespace std;int main(){ int iOK=0; //iOK用于记录解的个数 int iAdd,iSum,iAtemp,iStemp; int iForNubmer[10]; int i,j; cout<<"2008奥运趣味题的答案为:"<
'- =========================================================='* 文件名 :YPR_20085_VBA.bas'* 开发人员:袁培荣'* 当前版本:1.0.1.2595'* 创建时间:2012-02-23'* 修改时间:2012-02-23'* 功能说明:2008奥运趣味题(VBA版)'* 版权说明:版权所有 袁培荣 YuanPeirong '* 编译环境:Windows 7(x64) SP1 简体中文专业版'* VBA版本: 7.0.1590'- ==========================================================*/'/*- =========================================================='* 解题思路:'* 设被加数为iAdd,最小值为01234.设和为iSum,最大值为98765'* 则iAdd最大值为98765-20085=78680,从而取得iAdd取值范围'* 对每一个iAdd,可知iSum=iAdd+20085'* 将iAdd,iSum中每一位取出,放入一个一维十元素数组'* 对数组进行是否有相当元素的鉴别,若没有,符合要求'* 将符合要求的iAdd和iSum输出即可'* 可能有多组解,不能得到一组就放弃循环,要循环完iAdd所有取值'* 另外,20085中的两个0使得十位和百位相加时必须进位,则'* iAdd的百位为9,这个结论可以减少程度的运算次数。'- ==========================================================Private Sub CommandButton1_Click()Dim iOK As IntegerDim iAdd, iSum, iAtemp, iStemp As LongDim iForNumber(1 To 10) As LongDim i, j As IntegerDim IsSame As BooleanThisWorkbook.ActiveSheet.Cells(1, 1) = "2008奥运趣味题的答案为:"For iAdd = 1234 To 78680 iSum = iAdd + 20085 iAtemp = iAdd iStemp = iSum For i = 1 To 5 iForNumber(i) = iAtemp Mod 10 iAtemp = iAtemp \ 10 Next i For j = 6 To 10 iForNumber(j) = iStemp Mod 10 iStemp = iStemp \ 10 Next j IsSame = False For i = 1 To 9 For j = (i + 1) To 10 If (iForNumber(i) = iForNumber(j)) Then IsSame = True Exit For End If Next j If (IsSame = True) Then Exit For End If Next i If (IsSame = False) Then iOK = iOK + 1 Dim str As String ThisWorkbook.ActiveSheet.Cells(iOK + 1, 1) = "(" & iOK & ")" ThisWorkbook.ActiveSheet.Cells(iOK + 1, 2) = iAdd ThisWorkbook.ActiveSheet.Cells(iOK + 1, 3) = "+" ThisWorkbook.ActiveSheet.Cells(iOK + 1, 4) = 20085 ThisWorkbook.ActiveSheet.Cells(iOK + 1, 5) = "=" ThisWorkbook.ActiveSheet.Cells(iOK + 1, 6) = iSum End IfNext iAddThisWorkbook.ActiveSheet.Cells(iOK + 2, 1) = "结束"End Sub