大数阶乘 n! (当n>100)

熟悉编程的同学都知道,当n=100时,n!已经很大且超过了long的表示范围了。此时需要改变计算结果的存储方式。

我采用数组的形式存储结果。

相比于传统的迭代 将 (n-1)! 的结果作被乘数, n作乘数。

本文将两者的次序变换,可大大简化计算复杂度。

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int res[400000]={0};
 6     int n;
 7     while(cin>>n)
 8     {
 9        res[0]=1;
10        int height=1;  //************** height 表示结果的位数******************
11        for(int i=1;i<=n;i++)
12        {
13            int c=0;   //************** c表示进位
14            for(int j=0;j<height;j++)
15            {
16                 int tmp = res[j] * i + c;     // *****************节省了计算次数 同时也节省了数组位的变化
17                                               // ***************** 将被乘数按位 同乘数相乘!!!!
18                 res[j] = tmp%10;
19                 c = tmp/10;
20            }
21            /*****************************
22            *  按数位从高到低输出结果
23            *****************************/
24            while(c)
25            {
26               res[height++] = c%10;
27               c/=10;
28            }
29        }
30        for(int k=height-1;k>=0;k--)
31           cout<<res[k];
32        cout<<endl;
33     }
34     return 0;
35 }


本文还在本人百度空间http://hi.baidu.com/jackie_lee1989/item/d3285bd58c50c62d38f6f752上发布了。

posted @ 2012-07-25 17:10  Double_win  阅读(310)  评论(0编辑  收藏  举报