2008奥运趣味题 《JAVA程序设计》课本159页(1)
要求完成下面的表达式
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=35067
27951+20085=48036
37941+20085=58026
41973+20085=62058
51963+20085=72048
64932+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=35067
27951+20085=48036
37941+20085=58026
41973+20085=62058
51963+20085=72048
64932+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=35067
27951+20085=48036
37941+20085=58026
41973+20085=62058
51963+20085=72048
64932+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,这个结论可以减少程度的运算次数。
- ==========================================================*/
#include<iostream>
using namespace std;
int main()
{
int iOK=0; //iOK用于记录解的个数
int iAdd,iSum,iAtemp,iStemp;
int iForNubmer[10];
int i,j;
cout<<"2008奥运趣味题的答案为:"<<endl;
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;
}
bool IsSame=false;
for(i=0;i<=8;i++)
{
for(j=i+1;j<=9;j++)
{
if (iForNubmer[i]==iForNubmer[j])
{IsSame=true;break;}
}
if (true==IsSame)
{break;}
}
if (false==IsSame)
{
iOK++;
//cout<<iAdd<<"+20085="<<iSum<<endl;//用于运行结果1的输出
cout<<" "<<iAdd<<endl<<" +20085"<<endl;
cout<<"_______"<<endl<<" "<<iSum<<endl;
cout<<"======================="<<endl;//以上三行用于运行结果2的输出
}
}
cout<<"以上共有"<<iOK<<"组答案。"<<endl;
return 0;
}
/*- 运行结果1=====================================================
2008奥运趣味题的答案为:
14982+20085=35067
27951+20085=48036
37941+20085=58026
41973+20085=62058
51963+20085=72048
64932+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_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 Integer
Dim iAdd, iSum, iAtemp, iStemp As Long
Dim iForNumber(1 To 10) As Long
Dim i, j As Integer
Dim IsSame As Boolean
ThisWorkbook.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 If
Next iAdd
ThisWorkbook.ActiveSheet.Cells(iOK + 2, 1) = "结束"
End Sub