1 2 3 4 5 6 7 8 9 =110 在左邊數字之間加入運算子(+、-或不加),使得等式成立
阿新 • • 發佈:2019-02-02
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