在C語言學習初期,編寫判斷素數的函數以及用矩形法計算定積分是兩個非常經典的練習題目。它們不僅能鍛煉循環與函數的使用,還能加深對數學邏輯轉化為代碼的理解。
素數(質數)是指在大於1的自然數中,除了1和它本身以外沒有其他因數的數。編寫一個函數 prime(int n) 來判斷輸入整數是否為素數,核心思路是試除法:只需檢查從2到 sqrt(n) 之間的整數是否能整除 n。
#include <stdio.h>
#include <math.h>
int prime(int n) {
if (n <= 1) return 0; // 1及以下非素數
int i;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return 0; // 能整除,說明是合數
}
return 1; // 沒有找到因數,是素數
}
int main() {
int num;
printf("請輸入一個整數: ");
scanf("%d", &num);
if (prime(num))
printf("%d 是素數\n", num);
else
printf("%d 不是素數(或小於等於1)\n", num);
return 0;
}
關鍵點:循環條件 i <= sqrt(n) 大幅減少迭代次數;函數返回 1 表示素數,0 表示非素數,邏輯清晰。
定積分 ∫[a,b] f(x) dx 可用數值方法逼近。矩形法(又稱黎曼和)將區間 [a,b] 等分為 n 份,寬度 h = (b-a)/n,第 k 個矩形高度為 f(a + k*h),面積和即為積分近似值。
題目要求將被積函數 f(x)、積分函數 sab(a,b,n) 以及主函數分離:
double f(double x)(如 return x*x;)與 double sab(double a, double b, int n)。sab 並輸出結果。// file1.c
double f(double x) {
return x * x; // 例:f(x) = x^2
}
double sab(double a, double b, int n) {
double h = (b - a) / n;
double sum = 0.0;
for (int k = 1; k <= n; k++) {
sum += f(a + k * h);
}
return sum * h;
}
// main.c
#include <stdio.h>
extern double sab(double a, double b, int n); // 外部聲明
int main() {
double a, b; int n;
printf("輸入積分下限、上限、等分數: ");
scanf("%lf %lf %d", &a, &b, &n);
printf("積分近似值 = %lf\n", sab(a, b, n));
return 0;
}
編譯時需將兩文件連接:gcc main.c file1.c -o integral -lm。
選擇排序基本思想:每輪從無序區選出最小(或最大)元素,與無序區首位交換。時間複雜度 O(n²),適合小規模數據教學。
void selection_sort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
int min_idx = i;
for (int j = i+1; j < n; j++)
if (arr[j] < arr[min_idx]) min_idx = j;
if (min_idx != i) {
int tmp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = tmp;
}
}
}
主函數中初始化數組、調用排序、打印結果即可驗證。
這三個練習涵蓋了函數封裝、數學建模、模塊化編譯、數組操作等C語言核心技能。建議動手敲代碼、單步調試,體會邏輯與語法的結合。