本文精選自經典「C 語言 100 例」前 30 題,涵蓋基礎輸出、數學計算、數組操作、字符串處理、遞歸迭代、圖形打印等核心考點。每題提供:問題描述、算法分析、標準化 C99 代碼、邊界測試、複雜度分析。適合大一新生、考研復習、面試熱身。
問題:第 1、2 月各 1 對,從第 3 月起每月產生新對,新對第 3 月開始生產。求前 20 月數量。
分析:遞推關係 `F(n) = F(n-1) + F(n-2)`,`F(1)=F(2)=1`。迭代 O(n) 時間 O(1) 空間。
#include <stdio.h>
int main(void) {
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; // 等價於 f2 = f1 + f2 (舊 f1)
}
return 0;
}
分析:試除法至 `sqrt(n)`。優化:先除 2,再奇數步進 2。
#include <stdio.h>
#include <math.h>
int is_prime(int n) {
if (n < 2) return 0;
if (n % 2 == 0) return n == 2;
int limit = (int)sqrt(n);
for (int i = 3; i <= limit; i += 2)
if (n % i == 0) return 0;
return 1;
}
int main(void) {
int count = 0;
for (int m = 101; m <= 200; m++)
if (is_prime(m)) {
printf("%4d", m);
if (++count % 10 == 0) printf("\n");
}
printf("\nTotal: %d\n", count);
return 0;
}
分析:百位 `i=n/100`,十位 `j=n/10%10`,個位 `k=n%10`,判斷 `i³+j³+k³==n`。
int main(void) {
for (int n = 100; n < 1000; n++) {
int i = n / 100, j = n / 10 % 10, k = n % 10;
if (i*i*i + j*j*j + k*k*k == n)
printf("%d ", n);
}
return 0; // 輸出: 153 370 371 407
}
分析:從 2 開始試除,能除盡則輸出並縮小 n,不能則試下一數。
int main(void) {
int n;
scanf("%d", &n);
printf("%d=", n);
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
printf("%d", i);
n /= i;
if (n > 1) printf("*");
}
}
printf("\n");
return 0;
}
分析:`score>=90?'A':(score>=60?'B':'C')`。注意括號結合性。
int main(void) {
int score; char grade;
scanf("%d", &score);
grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C');
printf("%d -> %c\n", score, grade);
return 0;
}
int gcd(int a, int b) {
while (b) { int t = a % b; a = b; b = t; }
return a;
}
int main(void) {
int m, n; scanf("%d%d", &m, &n);
int g = gcd(m, n);
printf("GCD=%d, LCM=%d\n", g, m / g * n); // 先除後乘防溢出
return 0;
}
int main(void) {
int letter=0, space=0, digit=0, other=0;
int c;
while ((c = getchar()) != '\n' && c != EOF) {
if ((c>='a'&&c<='z') || (c>='A'&&c<='Z')) letter++;
else if (c == ' ') space++;
else if (c>='0'&&c<='9') digit++;
else other++;
}
printf("字母:%d 空格:%d 數字:%d 其他:%d\n", letter, space, digit, other);
return 0;
}
分析:項遞推 `term = term*10 + a`,累加 `sum += term`。
int main(void) {
int a, n; long long sum = 0, term = 0;
scanf("%d%d", &a, &n);
for (int i = 1; i <= n; i++) {
term = term * 10 + a;
sum += term;
}
printf("%lld\n", sum);
return 0;
}
分析:真因子和等於自身。優化:遍歷至 `sqrt(n)`,成對累加。
int main(void) {
for (int n = 2; n <= 1000; n++) {
int sum = 1;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
sum += i;
if (i != n / i) sum += n / i;
}
if (sum == n) printf("%d ", n);
}
return 0; // 6 28 496
}
int main(void) {
double h = 100.0, total = 100.0;
for (int i = 2; i <= 10; i++) {
h /= 2;
total += 2 * h; // 上升+下降
}
printf("總路程: %.2f, 第10次反彈: %.2f\n", total, h/2);
return 0;
}
(篇幅所限,核心代碼模式同上)
int main(void) {
int x; scanf("%d", &x);
int a = x / 10000, b = x / 1000 % 10, d = x / 10 % 10, e = x % 10;
if (a == e && b == d) printf("是回文數\n"); else printf("否\n");
return 0;
}
int main(void) {
char c1, c2;
scanf(" %c", &c1);
switch (c1) {
case 'M': puts("Monday"); break;
case 'W': puts("Wednesday"); break;
case 'F': puts("Friday"); break;
case 'T': scanf(" %c", &c2);
puts(c2=='u'?"Tuesday":"Thursday"); break;
case 'S': scanf(" %c", &c2);
puts(c2=='a'?"Saturday":"Sunday"); break;
default: puts("Error");
}
return 0;
}
(涉及 `conio.h` 非標準庫,現代環境建議用 ANSI 轉義序列或 ncurses)
void selection_sort(int a[], int n) {
for (int i = 0; i < n-1; i++) {
int min = i;
for (int j = i+1; j < n; j++)
if (a[j] < a[min]) min = j;
int t = a[i]; a[i] = a[min]; a[min] = t;
}
}
int main(void) {
int a[3][3], sum = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
for (int i = 0; i < 3; i++) sum += a[i][i];
printf("%d\n", sum);
return 0;
}
int main(void) {
int a[11] = {1,4,6,9,13,16,19,28,40,100};
int x; scanf("%d", &x);
int i = 9;
while (i >= 0 && a[i] > x) { a[i+1] = a[i]; i--; }
a[i+1] = x;
for (int j = 0; j < 11; j++) printf("%d ", a[j]);
return 0;
}
void reverse(int a[], int n) {
for (int i = 0, j = n-1; i < j; i++, j--) {
int t = a[i]; a[i] = a[j]; a[j] = t;
}
}
(見關鍵字深度解析文章)
(見關鍵字深度解析文章)
(見位運算完全指南文章)
(需 `graphics.h`,現代替代:SDL2、OpenGL、或 ASCII 繪圖)
| 類別 | 題號 | 核心考點 |
|---|---|---|
| 基礎循環/數學 | 1-10 | 斐波那契、素數、位運算、數列求和、完全數、物理模擬 |
| 字符/字符串 | 7,15,16 | 分類統計、回文、多級分支 |
| 數組/排序 | 21-24 | 選擇排序、矩陣操作、插入、逆序 |
| 存儲類別 | 25-27 | static/auto/register/extern |
| 預處理器 | 28-30 | 宏、條件編譯、頭文件 |
| 位運算 | 31-36 | &、|、^、~、掩碼、取位 |
| 圖形/非標準 | 37-39 | BGI 圖形庫(教學用) |