本系列首輯精選第 1 至 10 號經典範例,涵蓋窮舉法排列組合、分段函數獎金計算、數論完全平方數搜尋、日期累積天數計算、三數排序、字元圖形繪製、九九乘法表、國際象棋棋盤與樓梯圖案。這些範例以最基礎的語法構建核心演算法思維,是 C 語言入門的黃金教材。
for (i=1; i<5; i++)
for (j=1; j<5; j++)
for (k=1; k<5; k++)
if (i!=j && i!=k && j!=k)
printf("%d%d%d\n", i, j, k);
總共 4×3×2 = 24 組。延伸:若改用遞迴回溯,可輕鬆擴展至 N 個數字取 M 位排列。
利潤區間與提成率對應表:
| 利潤區間(萬) | 提成率 | 累積獎金基數 |
|---|---|---|
| 0~10 | 10% | bonus1 = 10 |
| 10~20 | 7.5% | bonus2 = 10 + 10×0.75 = 17.5 |
| 20~40 | 5% | bonus4 = 17.5 + 20×0.5 = 27.5 |
| 40~60 | 3% | bonus6 = 27.5 + 20×0.3 = 33.5 |
| 60~100 | 1.5% | bonus10 = 33.5 + 40×0.15 = 39.5 |
| >100 | 1% | bonus10 + (I-100)×0.01 |
long I; int bonus;
scanf("%ld", &I);
if (I <= 100000) bonus = I * 0.1;
else if (I <= 200000) bonus = 10000 + (I-100000)*0.075;
else if (I <= 400000) bonus = 17500 + (I-200000)*0.05;
else if (I <= 600000) bonus = 27500 + (I-400000)*0.03;
else if (I <= 1000000) bonus = 33500 + (I-600000)*0.015;
else bonus = 39500 + (I-1000000)*0.01;
printf("bonus=%d", bonus);
注意:原碼 bonus2=bonus1+100000*0.75 應為 0.075,此處已修正。
找 x 使 x+100 = a² 且 x+268 = b²(a,b 為整數)。
兩式相減:b² - a² = 168 → (b-a)(b+a) = 168。
枚舉 168 的因數對,解聯立方程組即得 x=21、x=156、x=1581 等解。程式採暴力搜尋 1~100000,驗證 sqrt 整數性。
int month_day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int sum = day;
for (int m = 0; m < month-1; m++) sum += month_day[m];
if (leap && month > 2) sum++;
閏年判斷:(year%400==0) || (year%4==0 && year%100!=0)。此法比 switch-case 更易維護擴充。
三兩兩交換法:先確保 x 最小,再確保 y <= z。邏輯清晰,無需陣列與迴圈,適合固定三數場景。
硬編碼列印:
****
*
*
****
啟發式思維:先在紙上畫網格標註座標,再轉為 printf 序列。
利用 ASCII 176 (░) 與 219 (█) 組合,雙重迴圈列印 5×5 矩陣。現代終端機建議使用 Unicode 方塊字元 (U+2588, U+2591) 跨平台顯示。
雙重迴圈 i=1..9, j=1..9,格式 %d*%d=%-3d 左對齊佔 3 寬,每行結束換行。經典巢狀迴圈教學範本。
(i+j)%2==0 判斷黑白格,列印兩個 ASCII 219 (█) 組成方塊,否則列印兩空格。展示座標 parity 判斷幾何圖形的通用技巧。
外層迴圈控制行數 i=1..10,內層列印 i 個方塊。開頭 printf("\1\1\n") 輸出兩個笑臉 (☺),為 DOS 控制台特有字元。
| 傳統寫法 | 現代 C (C99/C11) | C++ STL 替代 |
|---|---|---|
| 三層 for 窮舉 | 遞迴回溯 + 位元遮罩 | std::next_permutation |
| switch-case 日期累加 | 陣列查表 + 閏年函式 | std::chrono::year_month_day |
| 手動三數排序 | qsort + 比較函式 | std::array + std::sort |
| ASCII 圖形硬編碼 | 參數化繪圖函式 | SFML/SDL 文字渲染 |
void print_pattern(int rows, char filled, char empty) 統一範例 6~10 的圖形輸出。((i^j)&1)==0。下一集將進入函式設計、遞迴經典、字串處理與結構體綜合應用,敬請期待。