算法是程序的靈魂。好的算法不僅正確,更要結構清晰、易於機器執行(利用循環、分支)。本文通過三個經典例題,展示從「直觀步驟」到「計算機友好算法」的轉化過程。
缺點:步驟固定,擴展到 100! 需重寫 100 行。
S1: t ← 1
S2: i ← 2
S3: t ← t × i
S4: i ← i + 1
S5: 若 i ≤ 5 則轉 S3,否則結束
優勢:修改 S5 條件即可計算任意 n! (如 i ≤ 100)。
S1: t ← 1
S2: i ← 3
S3: t ← t × i
S4: i ← i + 2
S5: 若 i ≤ 11 則轉 S3,否則結束
若 S5 改為 若 i < 11,結果如何?
答:i 取值 3,5,7,9 (9<11 繼續,11<11 假結束),缺少 ×11,結果為 945 而非 10395。
數據結構:並行數組 n[i] (學號)、g[i] (成績)。
S1: i ← 1
S2: 若 g[i] ≥ 80 則輸出 n[i], g[i]
S3: i ← i + 1
S4: 若 i ≤ 50 則轉 S2,否則結束
關鍵點:順序遍歷、條件判斷、計數器控制循環次數。
S1: y ← 2000
S2: 若 y 不能被 4 整除 → 輸出 "不是閏年" → 轉 S6
S3: 若 y 能被 4 整除、不能被 100 整除 → 輸出 "是閏年" → 轉 S6
S4: 若 y 能被 100 整除、又能被 400 整除 → 輸出 "是閏年" → 轉 S6
S5: 輸出 "不是閏年" (能被 100 整除但不能被 400 整除)
S6: y ← y + 1
S7: 若 y ≤ 2500 則轉 S2,否則結束
bool isLeap(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
for (int y = 2000; y <= 2500; y++)
printf("%d %s\n", y, isLeap(y) ? "是閏年" : "不是閏年");
| 算法步驟 | 流程圖符號 | 說明 |
|---|---|---|
| S1: 賦初值 | 平行四邊形 (輸入/輸出) 或矩形 (處理) | 初始化變量 |
| S2-S5: 判斷 | 菱形 (判斷) | 多路分支 |
| S6: 遞增 | 矩形 (處理) | 循環變量更新 |
| S7: 循環條件 | 菱形 (判斷) | 決定是否回轉 |
將「人腦直觀步驟」轉化為「帶循環判斷的結構化算法」,是從初學者邁向程序設計師的關鍵一步。