匪警請撥110,即使手機欠費也可撥通!為了保障社會秩序,保護人民群眾生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,
阿新 • • 發佈:2019-01-01
方法一:
執行結果:/* 匪警請撥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或更高版本。 */ public class Demo14 { // 遍歷所有情況 public static void fun(String s) { char[] c = s.toCharArray(); StringBuffer sb = new StringBuffer(); // 記錄 組成的式子 int len = s.length()-1; // 字串長度 - 1 int[] sign = new int[len]; // sign用來標記符號, 最多有(s的長度-1)個符號 // 從後身前新增符號 while(sign[0]<3){ // 最前面的判定符號的值若 >=3 則結束迴圈 sb.append(c[0]); // 新增首元素 for(int i=0;i<len;i++){ if(sign[i]==1){ // 值為1新增"+"號 sb.append("+"); }else if(sign[i]==2){// 值為2新增"-"號 sb.append("-"); } sb.append(c[i+1]); // 不管新增不新增+-號,都新增後一個元素 } check(sb.toString()); // 驗證並輸出 sb.setLength(0); // 清空sb sign[len-1]++; // 每迴圈一次,最後一個符號值加1 for(int i=len-1;i>0;i--){ //當值等於3時,實現逢3進位 if(sign[i]==3){ sign[i] = 0; // sign[i] 歸零 sign[i-1]++; // sign[i-1]進位 } } } } // 驗證並輸出 public static void check(String str){ String[] s = str.split("[\\+]|[-]"); // 得到全部數字 String sign = str.replaceAll("\\d*", ""); // 得到全部符號(+-) int sum = Integer.parseInt(s[0]); // 把第一個數字給sum for(int i=0;i<s.length-1;i++){ switch(sign.charAt(i)){ case '+': sum += Integer.parseInt(s[i+1]); break; case '-': sum -= Integer.parseInt(s[i+1]); break; } } if(sum==110){ // 符合條件輸出 System.out.println(str); } } // 主函式 public static void main(String[] args){ String s = "123456789"; fun(s); } }
123+4+5+67-89
123+4-5-6-7-8+9
123-4+5-6-7+8-9
123-4-5+6+7-8-9
12+34+56+7-8+9
12+3+45+67-8-9
12-3+4-5+6+7+89
1+234-56-78+9
1+2+34+5+67-8+9
1-2+3+45-6+78-9
方法二:
遞迴演算法:
public class Demo15 { // 遍歷所有情況 public static void fun(String v, int n) { if(n==9){ // 修改到最後一位符號時輸出 check(v); }else{ // 遞歸向後修改,數字 變為 數字加符號 fun(v.replace(n+"", n+"+"),n+1); fun(v.replace(n+"", n+"-"),n+1); fun(v,n+1); } } // 驗證 並 輸出 public static void check(String str){ String[] s = str.split("[\\+]"); int sum = 0; for(String t:s){ String[] sub = t.split("[\\-]"); int num = Integer.parseInt(sub[0]); // 計算負數 for(int i=1;i<sub.length;i++){ num -= Integer.parseInt(sub[i]); } sum += num; // 正數或負數結果 加到 總和上 } if(sum == 110){ System.out.println(str); } } public static void main(String[] args){ String str = "123456789"; fun(str,1); // 呼叫函式,從1開始修改 } }
執行結果:
1+2+34+5+67-8+9
1+234-56-78+9
1-2+3+45-6+78-9
12+3+45+67-8-9
12+34+56+7-8+9
12-3+4-5+6+7+89
123+4+5+67-89
123+4-5-6-7-8+9
123-4+5-6-7+8-9
123-4-5+6+7-8-9