輸入 n, m。考慮前 n 個正偶數:2, 4, 6, ..., 2n。將它們每 m 個分為一組,計算每組平均值並輸出。最後一組不足 m 個也要輸出其平均值。多組測試至 EOF。
第 k 組(0-based)包含偶數:
2(km+1), 2(km+2), ..., 2(km+m)(最後一組可能較少)。
等差數列平均值 = (首項+末項)/2 = 2(km+1) + 2(min(km+m, n)) / 2 = 2km + m + 1(滿組情況)。
可直接 O(n/m) 計算,無需逐個累加。
原代碼逐個累加偶數,每 m 個輸出平均並重置。邏輯正確但效率較低,且變量命名 k, flag, sum 不夠清晰。
#include <stdio.h>
int main() {
int n, m;
while (scanf("%d %d", &n, &m) == 2) {
int groups = (n + m - 1) / m; // 向上取整組數
for (int g = 0; g < groups; g++) {
int start = g * m + 1; // 組內首項索引 (1-based)
int end = (g == groups-1) ? n : (g+1)*m; // 末項索引
// 平均值 = (首偶數 + 末偶數) / 2 = (2*start + 2*end) / 2 = start + end
int avg = start + end;
printf("%d%c", avg, (g == groups-1) ? '\n' : ' ');
}
}
return 0;
}
end。Input: 5 2
偶數: 2 4 6 8 10
分組: (2,4) avg=3; (6,8) avg=7; (10) avg=10
Output: 3 7 10
若數列為 a, a+d, a+2d, ...,第 g 組平均值 = a + d*(start+end-2)/2。同樣 O(1) 計算。