隨筆:1 2 3 4 5 6 7 8 9 =110 在左邊數字之間加入運算符(+、-或不加),使得等式成立

這道題是第三屆藍橋杯中的題,原題是這樣的:

匪警請撥110,即使手機欠費也可撥通!

    爲了保障社會秩序,保護人民羣衆生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!

    某批警察叔叔正在進行智力訓練:

    1 2 3 4 5 6 7 8 9 = 110;

    請看上邊的算式,爲了使等式成立,需要在數字間填入加號或者減號(可以不填,但不能填入其它符號)。之間沒有填入符號的數字組合成一個數,例如:12+34+56+7-8+9 就是一種合格的填法;123+4+5+67-89 是另一個可能的答案。

    請你利用計算機的優勢,幫助警察叔叔快速找到所有答案。

    每個答案佔一行。形如:

12+34+56+7-8+9
123+4+5+67-89
......

    已知的兩個答案可以輸出,但不計分。
    
    各個答案的前後順序不重要。

   注意:

    請仔細調試!您的程序只有能運行出正確結果的時候纔有機會得分!
    
    請把所有類寫在同一個文件中,調試好後,存入與【考生文件夾】下對應題號的“解答.txt”中即可。
    
    相關的工程文件不要拷入。
    
    請不要使用package語句。
    
    源程序中只能出現JDK1.5中允許的語法或調用。不能使用1.6或更高版本。

    這道題只是考尋路問題而已。我改了一下。把路徑也可以打印出來了。


分析:

這道題,只要切入點找準了,就可以很快解出來,我的解法是這樣的,這裏有9個數字,那麼數字與數字之間有八個空,每個空的有三種情況:加號、減號、空,每個空有三種可能,一共有八個空,所以有3^8=6561中可能,這種方法是窮舉所有的可能情況,所以個人感覺還可以優化!

編程時候,我用8個整數的整形數組來記錄這八個空情況,0代表沒有插入,1代表插入"+"號,2代表插入”-“,最後通過該整形數組轉換成對應的表達式,再計算其最終結果,如果爲110,則輸出!

java代碼如下:

public class oneOneZero
{
	public static void main(String[] args)
	{
		int[] result=new int[8];
		getResult(0,result);
	}
	//使用遞歸求出3^8種情況
	public static void getResult(int index,int[] result){
		if(index==8){
			showResult(result);//根據數組的取值轉換成表達式,且求值,這方法有待改進,寫的很亂
			return;
		}
		//每個空有三種可能,0,1,2
		for(int i=0;i<3;i++){
			result[index]=i;
			getResult(index+1,result);
			result[index]=0; //恢復原來的狀態
		}
	}
	public static void showResult(int[] result){
		
		int sum=0;
		//默認在第一個數字,即1之前是"+"號,方便編程而已
		char operateChar='+';
		String[] source=new String[]{"1","2","3","4","5","6","7","8","9"};
		//最終的表達式,最好用StringBuilder,在非多線程的情況下,字符串拼接的性能,StringBuilder最好,
		//當然用StringBuffer或者單純的String也可以
		StringBuilder expression=new StringBuilder();
		//用於記錄臨時的數字,因爲參與運算的數字可能是幾位的數字,所以也需要拼接
		StringBuilder number=new StringBuilder();
		//先加入第一個字符,即1
		number.append(source[0]);
		
		expression.append(source[0]);
		
		for(int i=0;i<result.length;i++){
			if(result[i]==0){//如果爲0,表示數字合併
				number.append(source[i+1]);
				expression.append(source[i+1]);
			}else if(result[i]==1){
				sum=calc(operateChar,sum,number);
				operateChar='+';
				number.append(source[i+1]);
				expression.append("+").append(source[i+1]);
			}else if(result[i]==2){
				sum=calc(operateChar,sum,number);
				operateChar='-';
				number.append(source[i+1]);
				expression.append("-").append(source[i+1]);
			}
		}
		sum=calc(operateChar,sum,number);
		if(sum==110){
			System.out.print(expression.toString()+"=110");
			System.out.println();
		}
	}
	public static int calc(char operateChar,int sum,StringBuilder number){
		if(operateChar=='+'){
			sum+=Integer.parseInt(number.toString());
			number.delete(0, number.length());
		}else if(operateChar=='-'){
			sum-=Integer.parseInt(number.toString());
			number.delete(0, number.length());
		}
		return sum;
	} 

}

輸出結果:

123+4+5+67-89=110
123+4-5-6-7-8+9=110
123-4+5-6-7+8-9=110
123-4-5+6+7-8-9=110
12+34+56+7-8+9=110
12+3+45+67-8-9=110
12-3+4-5+6+7+89=110
1+234-56-78+9=110
1+2+34+5+67-8+9=110
1-2+3+45-6+78-9=110




發佈了39 篇原創文章 · 獲贊 22 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章