大整数的阶乘

 2023-09-05 阅读 63 评论 0

摘要:阶乘:n!=n*(n-1)*(n-2)*⋯*2*1; 计算机中,通经常使用int类型保存数值 可是int取值范围有限( [-2147483648。2147483647]) 假如通过例如以下程序计算阶乘 #include<stdio.h> int Factorial(int n) {int i;if(n<=0){retur

阶乘:n!=n*(n-1)*(n-2)**2*1;
计算机中,通经常使用int类型保存数值
可是int取值范围有限( [-2147483648。2147483647])
假如通过例如以下程序计算阶乘

#include<stdio.h> 
int Factorial(int n)
{int i;if(n<=0){return 0;}if(n==1){return 1;}else{return n*Factorial(n-1);}
}
int main()
{int n;printf("输入一个整数n(n>0):");scanf("%d",&n);printf("%d!=%d\n",n,Factorial(n));return 0;
}

当计算17!

时会出现

这里写图片描写叙述

显然,须要一个程序来计算大于17的阶乘
思路:
如果求12!

。先求出11!

=3991 6800;
按位存入数组
这里写图片描写叙述
然后数组每一位乘以12。得
这里写图片描写叙述
进位
这里写图片描写叙述

按照这个思想,在不考虑计算机空间可性能的作用下得出程序:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//计算进位 
void Carry(int bit[],int pos)
{int i,carray=0;//从0~pos位逐位检查是否进位 for(i=0;i<=pos;i++){bit[i]+=carray;    //累加进位 if(bit[i]<=9)      //小于9不进位 {carray=0;}//大于9但不是最高位 else if(bit[i]>9&&i<pos){carray=bit[i]/10; //保存进位数 bit[i]%=10;         //得到该位的一位数 }//大于9且是最高位 else if(bit[i]>9&&i>=pos){while(bit[i]>9)  //循环向前进位 {carray=bit[i]/10;    //计算进位值 bit[i]%=10;         //当前的一位数 i++;bit[i]=carray;      //在下一位保存进位的值 }}}
}
int main()
{int num,pos,digit,i,j,m,n;double sum=0;  //计算阶乘结果的位数 int *fact;      //保存阶乘结果的指针 printf("输入计算阶乘的数num=");scanf("%d",&num);       //输入计算阶乘的数//计算阶乘结果的位数 for(i=1;i<=num;i++){sum+=log10(i);}digit=(int)sum+1;  //数据长度//分配保存 阶乘位数的内存 if(!(fact=(int *)malloc((digit+1)*sizeof(int)))){printf("分配内存失败!\n");return 0;}//初始化数组 for(i=0;i<=digit;i++){fact[i]=0;}fact[0]=1;  //设个位为1//将2~num逐个与原来的积相乘 for(i=2;i<=num;i++){//查找最高位 for(j=digit;j>=0;j--){if(fact[j]!=0){pos=j;  //记录最高位 break;}}for(j=0;j<=pos;j++){fact[j]*=i;  //每一位与i相乘 }Carry(fact,pos);  //进位处理 }//查找最高位 for(j=digit;j>=0;j--){if(fact[j]!=0){pos=j;   //记录最高位 break;}}m=0;  //统计输出位数 n=0;  //统计输出行数 printf("\n输出%d阶乘的结果(按随意键显示下一页):\n",num);//输出计算结果 for(i=pos;i>=0;i--){printf("%d",fact[i]);m++;if(m%4==0)    //每4个数字输出一个空格。方便阅读 {printf(" ");}if(m==40)  //每行最多40个数字 {printf("\n");m=0;n++;if(n==10)  //输出10行暂停输出 {getch();  //按随意键显示下一页 printf("\n");n=0;}}}printf("\n\n");printf("%d阶乘的结果共同拥有%d位。\n",num,pos+1);return 0;
} 

执行程序。求17的阶乘得到

这里写图片描写叙述

如果求100的阶乘:

这里写图片描写叙述

代码下载位置:

http://download.csdn.net/detail/u013553804/9496619
http://pan.baidu.com/s/1pLxi435


欢迎关注我的微信个人订阅号
这里写图片描写叙述
每天多学一点0.0

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/28.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息