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,把数组逆序输出。

posted @ 2013-03-04 17:07  KeenLeung  阅读(1410)  评论(0编辑  收藏  举报