循环的代价

来源:互联网 发布:支付系统网络硬件架构 编辑:程序博客网 时间:2024/05/16 09:16
例题2-4:阶乘之和
输入n,计算s=1!+2!+3!+……+n!的末6位(不含前导0)n<=10000.
样例输入:
10
样例输出:
37913

实现一:

#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=factorial * j;s=s+factorial;}printf("%d\n",s%1000000);return 0;}

实现一中运行输入100,输出-961703,明显溢出了,所以要采用实现二中的算法来实现,实际上25的阶乘有六个0,在25之后(包含25)的阶乘对结果无影响,所以当n>24时只需计算1!+2!+……+24!

实现二:

/*输入n,计算s=1!+2!+3!+……+n!的末六位(不含前导零)*/#include <stdio.h>/*从40开始答案就不便了,聪明的读者已经知道了,25!末尾有6个零,所以从第25项开始后面的项都不会影响和的末六位数字*/int main(){const int MOD=1000000;int n,s=0;scanf("%d",&n);if(n>24)n=24;for(int i=1;i<=n;i++){int factorial=1;for(int j=1;j<=i;j++)factorial=(factorial * j % MOD);s=(s+factorial)%MOD;}printf("%d\n",s);return 0;}



0 0