阶乘之和
输入 n n n,计算 S = 1 ! + 2 ! + 3 ! + ⋯ + n ! S=1!+2!+3!+ \cdots +n! S=1!+2!+3!+⋯+n! 的末尾6位(不含前导 0)。其中 n < 1 0 6 n<10^6 n<106。
BUG1:
#include<stdio.h>
int main() {
int n, S = 0;
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
int factorial = 1;
for (int j = 1; j <= i; j++)
factorial *= j;
S += factorial;
}
printf("%d\n", S % 1000000);
return 0;
}
输入10,输出 37913。 正确!
输入100,输出 -961703。错误!
原因:factorial *= j
乘法溢出
解决:①定义long long factorial = 1
\quad\quad ② 末尾6位,所有每次运算保留6位即可。
int32位: − 2 31 ∼ 2 31 − 1 ⟺ − 2147483648 ∼ 2147483647 ( 2 开 头 的 10 位 数 ) -2^{31}\sim2^{31}-1\Longleftrightarrow-2147483648\sim2147483647 (2开头的10位数) −231∼231−1⟺−2147483648∼