前言
大家小時候可能也玩過“組合車牌號裏的 4 個數字最終得到 10”的遊戲。組合的方法是在各個數字之間插入四則運算的運算符組成算式,然後計算算式的結果(某些數位之間可以沒有運算符,但最少要插入 1 個運算符)。
例 1234 → 1+2×3 - 4=3
9876 → 9×87+6=789
假設這裏的條件是,組合算式的計算結果爲“將原數字各個數位上的數逆序排列得到的數”,並且算式的運算按照四則運算的順序進行(先乘除,後加減)。
那麼位於 100~999,符合條件的有以下幾種情況。
351 → 3×51=153
621 → 6×21=126
886 → 8×86=688
問題
求位於 1000~9999,滿足上述條件的數。
代碼
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Q2 {
public static void main(String[] args) {
String[] op = new String[] { "+", "-","*", "/","" };
ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
for (int i = 1000; i < 10000; i++) {
String num = String.valueOf(i);
for (int j = 0; j < op.length; j++) {
for (int p = 0; p < op.length; p++) {
for (int k = 0; k < op.length; k++) {
if (op[j] == "" && op[p] == "" && op[k] == "") {
continue;
}
char c0 = num.charAt(0);
char c1 = num.charAt(1);
char c2 = num.charAt(2);
char c3 = num.charAt(3);
// 不能 /0
if ((c2 == '0' && op[j].equals("/")) || (c1 == '0' && op[p].equals("/"))
|| (c0 == '0' && op[k].equals("/"))) {
continue;
}
// 0不能開頭,因以0開頭是8進製表示
if ((c3 == '0' && op[j] == "") || (c2 == '0' && op[p] == "") || (c1 == '0' && op[k] == "")
|| (c2 == '0' && c3 == '0' && op[k] == "")) {
continue;
}
String string = c3 + op[j] + c2 + op[p] + c1 + op[k] + c0;
try {
if (String.valueOf(engine.eval(string)).equals(String.valueOf(i))) {
System.out.println("" + i + "=" + string);
}
} catch (Exception e) {
//System.err.println(string);
e.printStackTrace();
//continue;
}
}
}
}
}
}
}
注意的點有:需要對 0 進行特別處理。例如在java 中,“以 0 開頭的數”會被當作八進制數來處理,因此必須排除以0 開頭的數。此外,也需要排除除數爲 0 的情況
答案
1395=5931
思路改進
用“+”時,最大的值只有999+9=1008。逆序排列不可能得到原始值。當然,用“-”或’ \ ‘也不可能,只會使數變小,4位組合中最大的只用999,999做’ -’ 或 ’ \ '不能湊出四位。
所以將操作符數組改爲
String[] op = new String[] { "*","" };