2008奥运趣味题 《JAVA程序设计》课本159页(2)

2008奥运趣味题 《JAVA程序设计》课本159页(1)

要求完成下面的表达式java

    a b c d eios

   +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
相关文章
相关标签/搜索