本文整理《C程式設計的抽象思維》第1章 11 道編程練習題,涵蓋溫度/長度轉換、累加求和、數列計算、最大值查找、整數反轉、完全數判斷、質因數分解、浮點數四捨五入、萊布尼茲公式求 π、扇形面積逼近 π 等基礎與進階問題。每題提供完整代碼、核心邏輯解析與優化建議。
#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 格式化輸出。
#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;
}
修正:原代碼邏輯有誤,應為輸入公尺,輸出對應英制單位值。
#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) 複雜度。
#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²。
#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 初始化為最小可能值。
#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 的情況。
#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,成對累加因子。
#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 旗標控制乘號輸出,避免首尾多餘符號。
#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()。
#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 位精度。
#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 時面積 = π。中點法精度優於矩形法。