阶乘计算器~进阶版
本文已被浏览14775次
今天翻书看到一个程序,是计算阶乘的,不过计算阶乘太过简单了不就是:
#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应该能算这么大的数,直接乘就是了,不需要再分这么多存储空间去算。。。