用戶代碼片段:
for(i=3; i<=n; i++) {
k = sqrt(i);
for(j=2; j<=k; j++) {
if(i%j==0) break;
}
if(j >= k+1) { // 關鍵判斷
sum += sqrt(i);
}
}
等價於「內層循環完整遍歷完畢,未發現因數」,即判斷 `i` 為素數。
誤解了 `for` 循環的判斷順序:
這是 C 語言 `for` 循環的標準語義,非直觀預期。
#include
#include
int main() {
int n, i, j;
double sum = 0.0;
printf("輸入 n: ");
scanf("%d", &n);
for (i = 2; i <= n; i++) { // 從 2 開始 (2 是素數)
int isPrime = 1; // 假設是素數
int limit = (int)sqrt(i);
for (j = 2; j <= limit; j++) {
if (i % j == 0) {
isPrime = 0; // 發現因數,標記非素數
break;
}
}
if (isPrime) {
sum += sqrt(i);
}
}
printf("素數平方根和: %.4f\n", sum);
return 0;
}
#include
#include
#include
#include
int main() {
int n;
printf("輸入 n (建議 <= 10^7): ");
scanf("%d", &n);
if (n < 2) { printf("0.0000\n"); return 0; }
// 1. 篩法求素數
bool *isPrime = (bool*)malloc((n+1) * sizeof(bool));
for (int i = 2; i <= n; i++) isPrime[i] = true;
for (int i = 2; i*i <= n; i++) {
if (isPrime[i]) {
for (int j = i*i; j <= n; j += i) isPrime[j] = false;
}
}
// 2. 累加平方根
double sum = 0.0;
for (int i = 2; i <= n; i++) {
if (isPrime[i]) sum += sqrt(i);
}
printf("素數平方根和: %.4f\n", sum);
free(isPrime);
return 0;
}
| 問題代碼 | 規範代碼 | 理由 |
|---|---|---|
| 單字母變量 `i,j,k` | `num`, `divisor`, `limit` | 語義化命名,閱讀即文檔 |
| 無縮進/亂縮進 | 統一 4 空格縮進 | 結構一目了然 |
| 關鍵邏輯無註釋 | `// 判斷素數標誌` | 降低認知負荷 |
| 魔法數字 `k+1` | 常量 `PRIME_FLAG` / 布爾變量 | 消除隱性知識 |
| 聲明與使用分離 | 就近聲明 (C99+) | 減少作用域、提高局部性 |