輸入整數 m(測試組數),隨後 m 組數據,每組一個整數 x。計算級數 S = 1 - 1/2 + 1/3 - 1/4 + ... ± 1/x,輸出結果保留兩位小數。要求**所有輸入讀完後再統一輸出**。
#include
int main(void) {
int m;
scanf("%d", &m);
float results[1000]; // 假設 m <= 1000
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
float sum = 0;
int sign = 1; // 1, -1, 1, -1 ...
for (int j = 1; j <= x; j++) {
sum += sign * 1.0f / j;
sign = -sign; // 翻轉符號
}
results[i] = sum;
}
for (int i = 0; i < m; i++) {
printf("%.2f\n", results[i]);
}
return 0;
}
results[],讀完所有輸入後再循環輸出。不可邊讀邊輸出。int sign = 1; sign = -sign; 實現 + - + - 交替,避免 pow(-1, j) 浮點開銷。1.0f / j 強制浮點運算,防止整數除法截斷為 0。printf("%.2f\n", ...) 保留兩位小數。results[1000] 需滿足題目最大 m 限制,或動態分配。| 輸入 | 輸出 | 說明 |
|---|---|---|
| 2 1 2 | 1.00 0.50 | 1; 1-1/2=0.5 |
| 1 4 | 0.58 | 1-1/2+1/3-1/4=0.5833... |
若 m 極大且 x 範圍有限,可預計算 prefix[i] = prefix[i-1] + (-1)^(i+1)/i,查詢 O(1)。
float prefix[1000001];
prefix[0] = 0;
for (int i = 1; i <= 1000000; i++) {
prefix[i] = prefix[i-1] + (i%2==1 ? 1.0f/i : -1.0f/i);
}
// 查詢直接 prefix[x]