登录

在这个站点登录

保存我的登录记录

<<忘记密码?

还没有账号?点此注册>>

Jerry

阶乘计算器~进阶版

分享到:

本文已被浏览2002

今天翻书看到一个程序,是计算阶乘的,不过计算阶乘太过简单了不就是:

#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~~

 手机扫描左边的二维码,立刻将文章收入手机!
 微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.

评论

  1. aasll
    #1

    建议都写在一个单独的函数里,便于添加到自己的文件里。

    2015-03-31
    • Jerry

      可以这么干,不过只是做着玩,没有考虑写成标准函数~~

      2015-03-31
  2. aasll
    #2

    。。。方便我(们大家)复制啊

    2015-04-3
  3. jacklw
    #3

    请问这网页使用的是你源码? http://www.tglygl.cn/shuxue/jicheng.html

    2017-12-18
    • 那个网站不是我的,具体是什么算法不是清楚,我算了下100的阶乘,算出来是个浮点数科学计数法的格式(xxx+10Exx),可能和我这个不一样。具体可以看下他的JS代码,感觉js应该能算这么大的数,直接乘就是了,不需要再分这么多存储空间去算。。。

      2017-12-18

 您需要 先登录 才可以回复.