求數列前 N 項和:1 - 1/2 + 1/3 - 1/4 + 1/5 - ...(交替調和數列)。輸入多組測試用例,每組一個 n,輸出保留兩位小數。
用戶原算法:
a = 2;
for (...) {
if (a % 2 == 0) num -= 1.0/a;
else num += 1.0/a;
a++;
}
錯誤點:題目要求 a=2 時減,a=3 時加,但用戶代碼中 a 從 2 開始,**第一項是 1/2(應減)**,第二項 a=3 加,**第三項 a=4 減**……但題目數列是 1 - 1/2 + 1/3 - 1/4,**第一項是 1(a=1)**,用戶漏算了 a=1 且符號邏輯與題目項數對不上。
+1/1 (n=1)-1/2 (n=2)+1/3 (n=3)(-1)^(n+1) / n#include <stdio.h>
int main() {
int m, n;
scanf("%d", &m); // 測試用例數
while (m--) {
scanf("%d", &n);
double sum = 0.0;
for (int i = 1; i <= n; ++i) {
// 偶數項減,奇數項加
if (i % 2 == 0) sum -= 1.0 / i;
else sum += 1.0 / i;
}
printf("%.2f\n", sum);
}
return 0;
}
i % 2 == 1 加,i % 2 == 0 減(或用 pow(-1, i+1))。double 避免精度丟失。%.2f 保留兩位小數,自動四捨五入。1/i 為 0,必須 1.0/i。ACM 入門級數列求和,**循環變量對應項數、符號與項數奇偶性綁定、浮點數運算** 是三大核心。修正後代碼簡潔高效,時間複雜度 O(n) 完全滿足題目要求。