阶乘之和
输入 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∼2147483647(2开头的1

该博客讨论了计算阶乘之和时遇到的溢出问题,并提出解决方案,通过只保留运算结果的末尾6位来避免整数溢出。博主对比了C++、Python和MATLAB在处理这个问题时的效率差异,指出Python在for循环上的低效率,并暗示存在更优的算法优化方法。
最低0.47元/天 解锁文章
999

被折叠的 条评论
为什么被折叠?



