首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言入門必刷:100 道經典算法題目精選與標準化解法(上)

     編輯:關於C語言

前言

本文精選自經典「C 語言 100 例」前 30 題,涵蓋基礎輸出、數學計算、數組操作、字符串處理、遞歸迭代、圖形打印等核心考點。每題提供:問題描述、算法分析、標準化 C99 代碼、邊界測試、複雜度分析。適合大一新生、考研復習、面試熱身。

第 1 題:斐波那契數列(兔子繁殖)

問題:第 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;
}

第 2 題:101-200 素數統計

分析:試除法至 `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;
}

第 3 題:水仙花數(三位數自戀數)

分析:百位 `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
}

第 4 題:質因數分解

分析:從 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;
}

第 5 題:條件運算符嵌套分級

分析:`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;
}

第 6 題:最大公約數與最小公倍數(輾轉相除法)


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;
}

第 7 題:字符統計


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;
}

第 8 題:數列求和 a+aa+aaa+...

分析:項遞推 `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;
}

第 9 題:完數(完全數)

分析:真因子和等於自身。優化:遍歷至 `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
}

第 10 題:彈球高度與路程


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;
}

第 11-14 題:猴子吃桃、方程求根(迭代/牛頓/二分)、菱形打印

(篇幅所限,核心代碼模式同上)

第 15 題:回文數判斷(5 位數)


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;
}

第 16 題:星期判斷(首字母)


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;
}

第 17-20 題:顏色/光標控制、函數調用、文本屬性、篩法求素數

(涉及 `conio.h` 非標準庫,現代環境建議用 ANSI 轉義序列或 ncurses)

第 21 題:選擇排序


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;
    }
}

第 22 題:3×3 矩陣對角線和


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;
}

第 23 題:有序數組插入元素


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;
}

第 24 題:數組逆序


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;
    }
}

第 25-27 題:static/auto/register/extern 存儲類別演示

(見關鍵字深度解析文章)

第 28-30 題:宏定義練習、條件編譯、頭文件包含

(見關鍵字深度解析文章)

第 31-36 題:位運算系列(&、|、^、~、取位、取反)

(見位運算完全指南文章)

第 37-39 題:圖形庫繪圖(circle/line/rectangle)

(需 `graphics.h`,現代替代:SDL2、OpenGL、或 ASCII 繪圖)

總結:前 30 題知識點覆蓋表

類別題號核心考點
基礎循環/數學1-10斐波那契、素數、位運算、數列求和、完全數、物理模擬
字符/字符串7,15,16分類統計、回文、多級分支
數組/排序21-24選擇排序、矩陣操作、插入、逆序
存儲類別25-27static/auto/register/extern
預處理器28-30宏、條件編譯、頭文件
位運算31-36&、|、^、~、掩碼、取位
圖形/非標準37-39BGI 圖形庫(教學用)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved