1. 程式人生 > >1 2 3 4 5 6 7 8 9 =110 在左邊數字之間加入運算子(+、-或不加),使得等式成立

1 2 3 4 5 6 7 8 9 =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,則輸出!

    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