首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

藍橋杯帶分數問題:全排列遞歸邏輯中循環邊界條件詳解

     編輯:程式設計綜合問答

問題背景

代碼通過 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

邊界條件數學推導

1. num1 結束位置 a

for (int a = 0; a <= (n+"").length(); a++)
  • num1 位數不能超過 n 的位數(否則 num1 > n,分數部分為正,總和必大於 n)
  • (n+"").length() 獲取 n 的十進制位數

2. num2 結束位置 b — 關鍵的 8


for (int b = a+1; b < 8; b++)  // 此處 8 = 9 - 1
  • num3 至少需要 1 位數字 → b 最大只能到倒數第 2 個位置(索引 7)
  • 數組索引 0~8,共 9 個元素
  • b < 8 確保 b+1 <= 8,即 num3 至少包含索引 8 的 1 位數字

3. num3 範圍 — 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,代碼更簡潔且易擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved