大数阶乘 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上发布了。