【单选】执行下列代码后 s 的值是( )。
int s = 0;
for (int i = 1; i <= 100; i++)
if (i % 3 == 0 || i % 5 == 0)
s += i;这是"容斥原理"求和:先分别算出 1~100 中所有 3 的倍数之和、5 的倍数之和,再减去被重复计算的 15 的倍数之和。等差数列求和公式 n(a₁+aₙ)/2 一步到位。
只算 3 的倍数加 5 的倍数而漏掉减去 15 的倍数(得到 2733,正是错选 B);或把"倍数之和"错算成"倍数个数"。
模拟代码:
int s = 0;
for (int i = 1; i <= 100; i++)
if (i % 3 == 0 || i % 5 == 0)
s += i;本题实质是求 1~100 中所有 3 或 5 的倍数之和,用容斥原理一次算清。
1~100 中 3 的倍数是 3, 6, 9, …, 99,共 ⌊100/3⌋ = 33 项,公差 3 的等差数列:
S₃ = 3 × (1 + 2 + … + 33) = 3 × 33×34/2 = 3 × 561 = 1683
5, 10, …, 100,共 ⌊100/5⌋ = 20 项:
S₅ = 5 × (1 + 2 + … + 20) = 5 × 210 = 1050
既是 3 的倍数又是 5 的倍数即为 15 的倍数:15, 30, …, 90,共 ⌊100/15⌋ = 6 项:
S₁₅ = 15 × (1 + 2 + … + 6) = 15 × 21 = 315
s = S₃ + S₅ − S₁₅ = 1683 + 1050 − 315 = 2418
选 D。