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
相關文章
相關標籤/搜索