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

C語言交替級數求和:m-(m+1)+(m+2)-...±n 高效算法

     編輯:C 語言問答

交替級數求和:數學規律與 O(1) 算法

問題定義

計算 S = m - (m+1) + (m+2) - (m+3) + ... ± n,其中 m ≤ n,符號交替,首項為正。

例:m=1, n=100 → 1-2+3-4+...+99-100 = -50。

數學規律分析

相鄰兩項一組:[m - (m+1)] + [(m+2) - (m+3)] + ... = (-1) + (-1) + ...

  • 若項數 cnt = n - m + 1 為偶數:共 cnt/2 組,每組和為 -1,總和 S = -cnt/2。
  • 若項數為奇數:前 cnt-1 項配對,最後剩單項 n(正號),S = -(cnt-1)/2 + n。

O(1) 公式實現

#include <stdio.h>

long alt_sum(long m, long n) {
    if (m > n) { long t = m; m = n; n = t; }  // 確保 m <= n
    long cnt = n - m + 1;
    if (cnt % 2 == 0) return -cnt / 2;
    else return -(cnt - 1) / 2 + n;
}

int main() {
    long m, n;
    while (scanf("%ld %ld", &m, &n) == 2) {
        printf("sum = %ld\n", alt_sum(m, n));
    }
    return 0;
}

原答案代碼解析(等價邏輯)

long sum = 0, f = 1;
for (; m <= n; m++, f = -f)
    sum += m * f;

利用符號變量 f 在 1 和 -1 間翻轉,模擬交相加減。時間 O(n),簡單直觀,適用於 n-m 較小場景。

文件批量處理模板(題目要求)

void batch_process(const char *in_file, const char *out_file) {
    FILE *fin = fopen(in_file, "r"), *fout = fopen(out_file, "w");
    if (!fin || !fout) { perror("file"); return; }
    long m, n;
    while (fscanf(fin, "%ld,%ld", &m, &n) == 2) {
        fprintf(fout, "sum = %ld\n", alt_sum(m, n));
    }
    fclose(fin); fclose(fout);
}

進階:任意起始符號與步長

若級數為 S = a - (a+d) + (a+2d) - ...,同理可推導公式或用循環。關鍵是識別週期性模式,將 O(n) 降為 O(1)。

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