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

C語言 100 經典算法題精選(上):斐波那契、素數、水仙花、質因數分解

     編輯:關於C語言

算法是程序靈魂,經典題目是基本功磨刀石。本文精選 4 道入門必刷題,附分析與規範代碼,助你夯實邏輯與語法雙重基本功。

1. 兔子繁殖:斐波那契數列

題目: 一對兔子第 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 項。

2. 判斷 101-200 間素數

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

3. 水仙花數 (三位數自戀數)

定義: 三位數等於各位數字立方和。如 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;
}

4. 質因數分解

算法: 從最小質數 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;
}

5. 條件運算符嵌套分級

題目: ≥90→A, 60-89→B, <60→C

grade = score >= 90 ? 'A' : (score >= 60 ? 'B' : 'C');

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

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 題將涵蓋排序、查找、字符串、圖論、動態規劃等核心領域,敬請期待!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved