for (; m <= n; m++) {
if (prime(m) == 1)
count++; sum = sum + m; // 缺少大括號!sum 無條件執行
}
int prime(int m) {
for (i = 2; i <= m-1; i++) {
if (m % i == 0) return 0;
else return 1; // 邏輯錯誤:第一次不整除就返回 1,應循環結束後返回
}
}
sum = sum + m 不在 if 作用域內,**每次循環都累加 m**,導致 sum = 1+2+...+10 = 55。else return 1 使函數在 i=2 不整除時直接返回 1(如 9%2!=0 返回 1,實為合數)。正確寫法是循環結束無因子才返回 1。#include <stdio.h>
int prime(int m);
int main() {
int m, n, sum = 0, count = 0;
printf("Input m: "); scanf("%d", &m);
printf("Input n: "); scanf("%d", &n);
for (; m <= n; m++) {
if (prime(m)) { // 加大括號
count++;
sum += m;
}
}
printf("count=%d, sum=%d\n", count, sum);
return 0;
}
int prime(int m) {
if (m <= 1) return 0;
for (int i = 2; i * i <= m; i++) // 優化:只需判斷到 sqrt(m)
if (m % i == 0) return 0;
return 1; // 循環結束無因子,是質數
}
sqrt(m)(i*i <= m),大幅減少循環次數。if 必須加大括號包裹多語句,養成良好習慣避免此類低級錯誤。修正後輸入 1 10 正確輸出 count=4, sum=17(質數:2,3,5,7)。