算法是程序靈魂,經典題目是基本功磨刀石。本文精選 4 道入門必刷題,附分析與規範代碼,助你夯實邏輯與語法雙重基本功。
題目: 一對兔子第 3 個月起每月產一對,小兔第 3 月起同規律繁殖,無死亡,求月別總數。
規律: 1, 1, 2, 3, 5, 8, 13, 21... (Fn = Fn-1 + Fn-2)
#include <stdio.h>
int main() {
long f1 = 1, f2 = 1;
for (int i = 1; i <= 20; i++) {
printf("%12ld %12ld", f1, f2);
if (i % 2 == 0) printf("\n");
f1 = f1 + f2;
f2 = f1 + f2; // 兩步合一,每次產生兩項
}
return 0;
}
挑戰:改用一維數組存儲前 20 項。
分析: 試除法至 sqrt(n),能被整除則非素數。
優化: 先篩除偶數,步長 2;預計算平方根避免重複 sqrt。
#include <stdio.h>
#include <math.h>
int main() {
int count = 0;
for (int m = 101; m <= 200; m++) {
int k = (int)sqrt(m + 1);
int is_prime = 1;
for (int i = 2; i <= k; i++) {
if (m % i == 0) { is_prime = 0; break; }
}
if (is_prime) {
printf("%-4d", m);
if (++count % 10 == 0) printf("\n");
}
}
printf("\nTotal: %d\n", count);
return 0;
}
定義: 三位數等於各位數字立方和。如 153 = 1³+5³+3³。
技巧: 整除/取模分解百/十/個位。
#include <stdio.h>
int main() {
printf("Water flower numbers: ");
for (int n = 100; n < 1000; n++) {
int a = n / 100;
int b = n / 10 % 10;
int c = n % 10;
if (a*a*a + b*b*b + c*c*c == n)
printf("%-5d", n);
}
printf("\n");
return 0;
}
算法: 從最小質數 2 起試除,能整除則輸出並縮小商,否則試下一數。
輸出格式: 90=2*3*3*5
#include <stdio.h>
int main() {
int n, i;
printf("Input a number: ");
scanf("%d", &n);
printf("%d=", n);
for (i = 2; i <= n; i++) {
while (n != i) {
if (n % i == 0) {
printf("%d*", i);
n /= i;
} else break;
}
}
printf("%d\n", n); // 最後一個質因子
return 0;
}
題目: ≥90→A, 60-89→B, <60→C
grade = score >= 90 ? 'A' : (score >= 60 ? 'B' : 'C');
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; } // 先除防溢出
後續 94 題將涵蓋排序、查找、字符串、圖論、動態規劃等核心領域,敬請期待!