阶乘计算器~进阶版
本文已被浏览13294次
今天翻书看到一个程序,是计算阶乘的,不过计算阶乘太过简单了不就是:
#include <stdio.h> int main(){ int n,fact=1,i; scanf("%d",&n); for(i=1;i<=n;i++){ fact*=i; } printf("%d!=%dn",n,fact); return 0; }
但是,今天我要说的,不是上边这种只能算到31!的初级程序,今天我要算的,是100!200!300!甚至1000!(没试,时间太长了~~)的进阶版!
本文开始提到的那个算法在31!后会出现错误主要是因为int的取值范围的问题,当结果超出这个范围后就会无法存储导致错误.为了保证不会出现这种问题,我决定用数组来存储!
数组中每一个元素只存一个数字(理论上可以存入多个,可以算更大的数字),就可以解决变量存不下数据的问题.数组我试了一下,最多可以定义出一个519836长度的整数数组,而后来测试,后边的代码要想执行,就不能大于519264,所以下面我定义了519264,也就是说最后的结果的取值范围为1~10^519264,这样就大大增加了可计算的范围.
算法分析:
Step 0:读入阶乘目标数字Tg,定义i=1
Step 1:Num数组每一个都乘比Tg小的一个数i(相同)
Step 2:依次检验每个元素是否达到10,达到的向更高位进一(或其他数字)
Step 3:打印Num(主要是为了造成视觉冲击~~)
Step 4:i递增如果比Tg大1则结束否则回Step 1
这个实例其实只是将乘法运算的法则用程序语言重新写了一下,要知道,竖式运算的运算法则是不限制两个因数大小的!代码如下:
/**********版权声明************** 本博客展出的代码均为Jerry原创,转载请注明 严禁使用本博客的内容代替作业,算法可以借鉴 但不要连变量名都不改的就抄走! *******************************/ #include <stdio.h> int main(){ //声明最大许可519836,运行最大许可519264 int i,j,L=1,Tg,Num[519264]={1}; //读入阶乘运算数字 scanf("%d",&Tg); //大循环每次乘一个数 for(i=1;i<=Tg;i++){ //小循环进行乘法运算 //L的作用是防止最后或中间有0时候卡住 for(j=0;j<L||Num[j]!=0;j++){ Num[j]=Num[j]*i; } //将L值刷新 L=j; //将低位的超过十的进一 for(j=0;j<L||Num[j]!=0;j++){ Num[j+1]=Num[j+1]+Num[j]/10; Num[j]=Num[j]%10; } //刷新L值 L=j; //输出 XXX!= printf("%d!= ",i); //一位一位的输出最后结果 //注意:Num的顺序和真实结果顺序相反 for(j--;j>=0;j--){ printf("%d",Num[j]); } //一次循环结束,换行 printf("n"); } return 0; }
有兴趣各位可以试试他的极限,看看到多少的阶乘会BUG~~
建议都写在一个单独的函数里,便于添加到自己的文件里。
可以这么干,不过只是做着玩,没有考虑写成标准函数~~
。。。方便我(们大家)复制啊
额~~不要抄袭,抄袭不好的~~
请问这网页使用的是你源码? http://www.tglygl.cn/shuxue/jicheng.html
那个网站不是我的,具体是什么算法不是清楚,我算了下100的阶乘,算出来是个浮点数科学计数法的格式(xxx+10Exx),可能和我这个不一样。具体可以看下他的JS代码,感觉js应该能算这么大的数,直接乘就是了,不需要再分这么多存储空间去算。。。