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

《C程式設計的抽象思維》第1章編程練習題完整解析

     編輯:關於C語言

前言

本文整理《C程式設計的抽象思維》第1章 11 道編程練習題,涵蓋溫度/長度轉換、累加求和、數列計算、最大值查找、整數反轉、完全數判斷、質因數分解、浮點數四捨五入、萊布尼茲公式求 π、扇形面積逼近 π 等基礎與進階問題。每題提供完整代碼、核心邏輯解析與優化建議。

練習 1:攝氏溫度轉華氏溫度

#include <stdio.h>
int main() {
    double c;
    while(scanf("%lf", &c) == 1) {
        printf("%.2f\n", c * 9.0 / 5 + 32);
    }
    return 0;
}

要點:使用 9.0/5 強制浮點運算,避免整數除法截斷;%.2f 格式化輸出。

練習 2:英制長度單位換算

#include <stdio.h>
int main() {
    double meter;
    while(scanf("%lf", &meter) == 1) {
        printf("YCI: %.4f\n", meter / 0.0254);   // 公尺轉英寸
        printf("YC:  %.4f\n", meter / 12.0);    // 公尺轉英尺 (近似)
    }
    return 0;
}

修正:原代碼邏輯有誤,應為輸入公尺,輸出對應英制單位值。

練習 3:1 到 100 求和

#include <stdio.h>
int main() {
    int sum = 0;
    for(int i = 1; i <= 100; i++) sum += i;
    printf("%d\n", sum);  // 5050
    return 0;
}

數學公式:n(n+1)/2 = 100×101/2 = 5050,O(1) 複雜度。

練習 4:數列求和 1 + 3 + 5 + ... + (2N-1)

#include <stdio.h>
int main() {
    int n, sum = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) sum += 2*i - 1;
    printf("%d\n", sum);  // 等於 n²
    return 0;
}

規律:前 n 項奇數和 = n²。

練習 5:哨兵結束輸入尋找最大值

#include <stdio.h>
int main() {
    int max = -1, n;
    printf("Enter 0 to signal the end.\n? ");
    while(scanf("%d", &n) == 1 && n != 0) {
        if(n > max) max = n;
        printf("? ");
    }
    printf("The largest value is %d\n", max);
    return 0;
}

模式:哨兵控制迴圈,max 初始化為最小可能值。

練習 6:整數位數反轉輸出

#include <stdio.h>
void print_reverse(int n) {
    printf("The reverse number is ");
    do {
        printf("%d", n % 10);
        n /= 10;
    } while(n > 0);
    printf("\n");
}
int main() {
    int n;
    printf("Enter a positive integer: ");
    scanf("%d", &n);
    print_reverse(n);
    return 0;
}

改進:使用 do-while 處理輸入 0 的情況。

練習 7:尋找 10000 以內完全數

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

bool is_perfect(int n) {
    if(n < 2) return false;
    int sum = 1;
    int limit = (int)sqrt(n);
    for(int i = 2; i <= limit; i++) {
        if(n % i == 0) {
            sum += i;
            if(i != n / i) sum += n / i;  // 避免平方數重複加
        }
    }
    return sum == n;
}

int main() {
    for(int i = 2; i <= 9999; i++)
        if(is_perfect(i)) printf("%d\n", i);
    // 輸出: 6, 28, 496, 8128
    return 0;
}

優化:只遍歷到 √n,成對累加因子。

練習 8:質因數分解(格式化輸出)

#include <stdio.h>
#include <math.h>

void factorize(int n) {
    int first = 1;
    for(int p = 2; p * p <= n; p++) {
        while(n % p == 0) {
            if(!first) printf(" * ");
            printf("%d", p);
            first = 0;
            n /= p;
        }
    }
    if(n > 1) {
        if(!first) printf(" * ");
        printf("%d", n);
    }
    printf("\n");
}

int main() {
    int n;
    printf("Enter number to be factored: ");
    while(scanf("%d", &n) == 1) {
        factorize(n);
        printf("Enter number to be factored: ");
    }
    return 0;
}

技巧:first 旗標控制乘號輸出,避免首尾多餘符號。

練習 9:浮點數四捨五入轉整數

#include <stdio.h>
#include <math.h>

int my_round(float x) {
    if(x >= 0) return (int)floor(x + 0.5);
    else return (int)ceil(x - 0.5);
}

int main() {
    float n;
    while(scanf("%f", &n) == 1)
        printf("%d\n", my_round(n));
    return 0;
}

標準庫:C99 提供 round()、lround()、llround()。

練習 10:萊布尼茲公式計算 π

#include <stdio.h>

double leibniz_pi(int n) {
    double sum = 0.0;
    int sign = 1;
    for(int i = 1; i <= n; i++) {
        sum += sign * 1.0 / (2*i - 1);
        sign = -sign;
    }
    return 4 * sum;
}

int main() {
    printf("%.10f\n", leibniz_pi(10000));  // 3.1414926536
    return 0;
}

收斂性:極慢,需百萬項才達小數點後 6 位精度。

練習 11:扇形面積積分逼近 π

#include <stdio.h>
#include <math.h>

#define N 1000000

double integral_pi() {
    double r = 2.0;
    double w = r / N;
    double sum = 0.0;
    for(int i = 1; i <= N; i++) {
        double x = w * (i - 0.5);  // 中點法
        sum += sqrt(r*r - x*x) * w;
    }
    return sum;  // 1/4 圓面積 = π
}

int main() {
    printf("%.10f\n", integral_pi());
    return 0;
}

原理:y = √(r²-x²) 為圓上半部,積分得面積 πr²/4,r=2 時面積 = π。中點法精度優於矩形法。

總結與進階方向

  • 基礎 I/O、迴圈、條件判斷、函式封裝
  • 數學思維:公式優化、數值穩定性、收斂速度
  • 工程實踐:格式化輸出、錯誤處理、邊界測試
  • 延伸主題:數值分析、計算幾何、密碼學(質數)、科學計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved