c++:计算阶乘的准确值
摘自:http://blog.sina.com.cn/s/blog_9e0097f701010ve5.html
题目要求:输入不超过1000的正整数n,输出n=1*2*3*...*n的精确结果。
样例输入:30
样例输出:265252859812191058636308480000000
程序源代码:
#include<stdio.h>
#include<string.h>
#define MAX 3000
int a[MAX];
int main()
{
int i,j,n;
memset(a,0,sizeof(a));
scanf("%d",&n);
a[0]=1;
for(i=2;i<=n;i++)
{
int c=0;
for(j=0;j<MAX;j++)
{
int s=a[j]*i+c;
a[j]=s % 10;
c=s/10;
}
}
for(j=MAX-1;j>=0;j--) if(a[j]) break;//忽略前导0
for(i=j;i>=0;i--) printf("%d",a[i]);
printf("\n");
return 0;
}
分析:
999!是个很大的数字,普通的数据类型肯定无法储存,我们可以用整型数组来储存这个数字,a[0]保存结果的个位,a[1]保存十位,a[3]保存百位.....。注意数组是按结果的逆序保存的,这样的话就可以模拟手算进行计算,可以进行进位的处理,对于每一个i:1.i与个位相乘加进位c(开始设为0)后对10取余得到运算后个位应得的结果 2.对10取整得到进给十位的数字c 3.i与十位相乘加进位c后对10取余得到运算后十位应得的结果
。4如此往复直到i=n运算完毕。
要储存这个大数,就要先知道这个数有多少位,数组的长度要大于位数。1000!=4*10^2567。
还要注意数组的最后可能有很多0,所以输出结果时要忽略后面的所有0,把数组逆序输出。