| # | 題目 | 核心知識點 |
|---|---|---|
| 1 | 最大公約數/最小公倍數 | 輾轉相除法 (歐幾里得演算法) |
| 2 | 大小寫字母統計 | 字元分類、ASCII 碼範圍 |
| 3 | a+aa+aaa... 疊加求和 | 迴圈累積、位移運算思維 |
| 4 | 階乘累加 1!+2!+...+n! | 迴圈遞推計算階乘 |
| 5 | 質數判斷函數 | 試除法、優化至 sqrt(n) |
| 6 | 三角形面積 (海倫公式) | 結構體、三角不等式、海倫公式 |
| 7 | 圓重疊判斷 | 結構體、兩點距離公式、半徑和比較 |
| 8 | 字串凱薩加密 | 字元循環位移、邊界處理 |
| 9 | 10 數最大/最小值 | 單次掃描雙變數追蹤 |
| 10 | 野指標錯誤分析 | 區域變數生命週期、指標懸空 |
| 11 | 三點構成三角形面積 | 點結構體、距離公式、海倫公式 |
| 12 | 印出 100 個質數 | 質數判斷函數複用、計數器控制 |
| 13 | 10 數平均值 | 累加求和、浮點數除法 |
| 14 | 交錯級數 1-2+3-4...+100 | 奇偶判斷、累加器正負切換 |
| 15 | 分數級數 1/2+2/3+...+n/(n+1) | 整數除法陷阱、需轉浮點數 |
int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
int lcm(int a, int b) {
return a / gcd(a, b) * b; // 先除後乘防溢位
}
int isPrime(int x) {
if (x < 2) return 0;
for (int i = 2; i * i <= x; i++) { // 優化:只需檢查至 sqrt(x)
if (x % i == 0) return 0;
}
return 1;
}
// 印前 100 個質數
void printFirst100Primes() {
int count = 0, num = 2;
while (count < 100) {
if (isPrime(num)) {
printf("%d ", num);
count++;
}
num++;
}
}
typedef struct { double x, y; } Point;
typedef struct { double a, b, c; } Triangle;
double triangleArea(Triangle t) {
if (t.a + t.b <= t.c || t.a + t.c <= t.b || t.b + t.c <= t.a)
return -1; // 無法構成三角形
double s = (t.a + t.b + t.c) / 2;
return sqrt(s * (s - t.a) * (s - t.b) * (s - t.c));
}
double triangleAreaFromPoints(Point p1, Point p2, Point p3) {
double a = hypot(p1.x - p2.x, p1.y - p2.y);
double b = hypot(p1.x - p3.x, p1.y - p3.y);
double c = hypot(p2.x - p3.x, p2.y - p3.y);
Triangle t = {a, b, c};
return triangleArea(t);
}
typedef struct { double x, y, r; } Circle;
int circlesOverlap(Circle c1, Circle c2) {
double dx = c1.x - c2.x;
double dy = c1.y - c2.y;
double dist = sqrt(dx*dx + dy*dy);
return dist < (c1.r + c2.r); // 嚴格小於:相切不算重疊
}
void encrypt(char *str) {
for (int i = 0; str[i]; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
str[i] = (str[i] == 'z') ? 'a' : str[i] + 1;
} else if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] = (str[i] == 'Z') ? 'A' : str[i] + 1;
}
}
}
int *p;
{
int a = 10; // 區塊結束時 a 被銷毀
p = &a;
}
*p = 20; // 錯誤!p 指向已釋放的棧記憶體 → 未定義行為
修正:使用動態記憶體 p = malloc(sizeof(int)) 或延長變數生命週期。
// 錯誤:整數除法截斷 int sum = 0; for (int i = 1; i <= n; i++) sum += i / (i + 1); // 全部為 0! // 正確:轉浮點數 double sum = 0.0; for (int i = 1; i <= n; i++) sum += (double)i / (i + 1);
| 模式 | 程式碼範本 | 適用題目 |
|---|---|---|
| 單次掃描統計 | for(i=0; str[i]; i++) { if(cond) cnt++; } | 2, 9, 18 |
| 輾轉相除 | while(b){ r=a%b; a=b; b=r; } | 1 |
| 試除法質數 | for(i=2; i*i<=n; i++) if(n%i==0) return 0; | 5, 12 |
| 海倫公式 | s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)) | 6, 11 |
| 雙指標交換 | temp=p[n]; p[n]=p[m]; p[m]=temp; | 14 |
| 陣列前移刪除 | for(j=i; j | 10, 12 |
long long 或 doubledouble/float這 15 道題精準覆蓋 C 語言基礎考試的高頻考點:演算法實作 (GCD、質數、海倫)、字元/字串處理、結構體應用、指標陷阱、數值計算陷阱。掌握上述通用模式與邊界思維,配合標準庫函數 (sqrt, hypot, strtok) 靈活運用,即能高效解決同類問題。