阶乘: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的阶乘:
代码下载位置:
欢迎关注我的微信个人订阅号
每天多学一点0.0