計算 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。#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)。