程序員的算法趣題 :Q2 數列的四則運算 java實現

前言

大家小時候可能也玩過“組合車牌號裏的 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[] { "*","" };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章