代碼通過 9 層嵌套循環生成 1~9 的全排列,將每個排列分成三段構成帶分數 num1 + num2/num3,檢查是否等於輸入 n。疑問點在於:
num2 循環邊界 b < 8 中的 8 從哪來?num3 循環邊界 c < count.length 為何是數組長度?count 數組長度固定為 9(數字 1~9 各一次)。將其切分為三段:
[0 ... a] [a+1 ... b] [b+1 ... 8] num1 num2 num3
for (int a = 0; a <= (n+"").length(); a++)
num1 位數不能超過 n 的位數(否則 num1 > n,分數部分為正,總和必大於 n)(n+"").length() 獲取 n 的十進制位數8
for (int b = a+1; b < 8; b++) // 此處 8 = 9 - 1
num3 至少需要 1 位數字 → b 最大只能到倒數第 2 個位置(索引 7)b < 8 確保 b+1 <= 8,即 num3 至少包含索引 8 的 1 位數字count.length
for (int c = b+1; c < count.length; c++) // count.length = 9
num3 佔用剩餘所有數字,從 b+1 到數組末尾(索引 8)count.length 即 9,循環條件 c < 9 覆蓋索引 8
索引: 0 1 2 3 4 5 6 7 8
數字: [1][2][3][4][5][6][7][8][9]
↑ ↑ ↑
a b c
num1: 0~a (≤ n位數)
num2: a+1~b (b ≤ 7, 留1位給num3)
num3: b+1~8 (固定到末尾)
9 層循環極其低效(9! = 362,880 次),建議使用 遞歸/回溯生成全排列 或 next_permutation,代碼更簡潔且易擴展。