輸入兩個整數 m, n(多組,EOF 結束),計算區間 [min(m,n), max(m,n)] 內:
aba b
#include
int main(void) {
int m, n;
while (scanf("%d %d", &m, &n) == 2) {
// 確保 m <= n
if (m > n) {
int t = m; m = n; n = t;
}
long long even_sq_sum = 0, odd_cu_sum = 0;
for (int i = m; i <= n; i++) {
if (i % 2 == 0) {
even_sq_sum += 1LL * i * i; // 1LL 強制長長整型運算防溢出
} else {
odd_cu_sum += 1LL * i * i * i;
}
}
printf("%lld %lld\n", even_sq_sum, odd_cu_sum);
}
return 0;
}
m <= n,簡化循環邊界。i*i 或 i*i*i 易溢出 32 位 int,乘以 1LL 提升運算精度。i % 2 == 0 為偶數,!= 0 為奇數(含負數)。i <= n。| 輸入 | 輸出 | 說明 |
|---|---|---|
| 1 5 | 20 153 | 偶數:2²+4²=20; 奇數:1³+3³+5³=153 |
| 5 1 | 20 153 | 自動交換 |
| -2 2 | 8 0 | 偶數:(-2)²+0²+2²=8; 奇數:-1³+1³=0 |
若區間極大(如 1 到 109),循環超時,可用求和公式:
4 * Σk² (k=1..n/2) = 4 * n/2 * (n/2+1) * (n+1) / 6Σ(2k-1)³ = 2n⁴ - n² (推導略)但 OJ 題目通常數據範圍允許 O(n) 循環,直觀代碼優先。