首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

杭電OJ 2011 題解:交替調和級數求和——分組輸出與符號控制

     編輯:關於C

題目描述

輸入整數 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;
}

關鍵點

  1. 分組輸出要求:先存入數組 results[],讀完所有輸入後再循環輸出。不可邊讀邊輸出。
  2. 符號控制:int sign = 1; sign = -sign; 實現 + - + - 交替,避免 pow(-1, j) 浮點開銷。
  3. 浮點除法:1.0f / j 強制浮點運算,防止整數除法截斷為 0。
  4. 格式控制:printf("%.2f\n", ...) 保留兩位小數。
  5. 數組大小:results[1000] 需滿足題目最大 m 限制,或動態分配。

測試用例

輸入輸出說明
2
1
2
1.00
0.50
1; 1-1/2=0.5
1
4
0.581-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]
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved