首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ACM 2011 題目求解:數列求和邏輯錯誤修正與 AC 代碼詳解

     編輯:程式設計疑難解答

題目重現

求數列前 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/1 (n=1)
  • 第 2 項:-1/2 (n=2)
  • 第 3 項:+1/3 (n=3)
  • 通項:(-1)^(n+1) / n

AC 代碼(C 語言)

#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;
}

關鍵點總結

  1. 循環變量從 1 開始,對應數列第 1 項。
  2. 符號判斷:i % 2 == 1 加,i % 2 == 0 減(或用 pow(-1, i+1))。
  3. 雙精度累加:用 double 避免精度丟失。
  4. 每組用例重置 sum,避免跨用例累加。
  5. 格式化輸出:%.2f 保留兩位小數,自動四捨五入。

常見坑點提醒

  • 整數除法:1/i 為 0,必須 1.0/i。
  • 未重置累加器導致後續用例錯誤。
  • 輸入結束條件處理(EOF 或首個 m)。

總結

ACM 入門級數列求和,**循環變量對應項數、符號與項數奇偶性綁定、浮點數運算** 是三大核心。修正後代碼簡潔高效,時間複雜度 O(n) 完全滿足題目要求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved