阶乘之和的正确程序(没有乘法的溢出问题以及效率低下的解决方法)
2014-10-07 11:59
302 查看
#include <stdio.h> #include <time.h> int main(){ const int MOD=1000000; int i,j,n; int s=0; scanf("%d",&n); for(i=1;i<=n;i++){ int factorial=1.0; for(j=1;j<=i;j++){ factorial=factorial*j%MOD; } s=(factorial+s)%MOD; } printf("%d\n",s); printf("Time used=%.2lf\n",(double)clock()/CLOCKS_PER_SEC); return 0; }
这里的
factorial=factorial*j%MOD;
表示去每个阶乘的末6位,这样不会导致乘法溢出,将factorial的值每次%MOD取得末六位,然后末六位再相乘得到的值%MOD仍然是末六位,和全部n!相乘得到的值取末六位是一样的(数学思路)
当n从25开始答案末六位始终不变,是应为25!的末六位是6个0,当n>25时n!的末六位都是0,所以不需要都不会影响程序的末六位的值
只要在程序里面再加if(n>25){
n=25;
}然后效率和溢出都不成问题
通过操作命令行可以知道当N夸大一倍时,运行时间大约夸大4倍,可以推断n=10^5时,程序大约需要近5个小时才跑完
相关文章推荐
- 区别对待 【找到问题发生的原因】 以及 【关于这个问题的 「正确可行」 的解决方法】
- win7 win8计算机-右键-管理“该文件没有与之关联的程序来执行该操作”问题的解决方法
- pb9.0 5507升级8836过程中出现的问题以及升级后工程运行没有反映的解决方法。
- Java程序中遇到的乱码问题以及解决方法
- 近几天 用微芯力科的板子 调试usb虚拟串口的程序,发现一些问题以及解决方法。和大家共享
- VS.net2005写的程序如何在没有.Net FrameWork的机器上运行 --解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”(转载)
- 递归的定义以及递归的示例(计算阶乘、计算斐波那契数、递归二分查找、回文串递归方法解决、汉诺塔问题、递归选择排序问题)
- 没有网络连接时程序崩溃问题以及动态加载图片问题已解决
- LoadRunner本机录制http协议程序遇到的问题以及解决方法
- Java程序中遇到的乱码问题以及解决方法
- Java程序中遇到的乱码问题以及解决方法
- oracle10g "数据源管理器"找不到应用程序,可能是程序没有正确安装"问题解决
- LoadRunner本机录制http协议程序遇到的问题以及解决方法
- Win7计算机管理提示找不到文件或没有关联的程序问题解决方法
- [VS2008] Debug版本程序发布后 由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题 解决方法
- 编译Android驱动对应的C测试程序出错的解决方法以及正确流程
- 说一下你的程序在ios5里面遇到的兼容性问题以及解决方法吧
- 关于“计算机opencv_imgcodecs340d.dll,因为没有程序不能开始。。。”问题的解决方法
- 多线程程序退出内存句柄泄漏的问题以及解决方法
- 【共享】解决“无法显示进程。没有正确安装调试器。请运行安装程序安装或修复调试器。”错误的方法。