阶乘: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