51nod 1057 N的阶乘
大数的乘法。
对这个超级大的数进行了切分,具体切成多宽的看个人爱好,只要能够用几个数据类型装下来就好,这里我们划分成了8个的宽度,每八位存一下,最后再进行格式化输出,巧妙的避开了爆数据范围的问题。c和进位相关,m和切的段数相关。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 #define MAX 100000000 7 long long a[10005]; 8 main() 9 { 10 int n,i,j,m,c; 11 scanf("%d",&n); 12 a[0]=1; 13 m=0; 14 for(i=1;i<=n;i++) 15 { 16 c=0; 17 for(j=0;j<=m;j++) 18 { 19 a[j]=a[j]*i+c; 20 c=a[j]/MAX; 21 a[j]=a[j]%MAX; 22 } 23 if(c>0) 24 { 25 m++; 26 a[m]=c; 27 } 28 } 29 printf("%lld",a[m]); 30 for(i=m-1;i>=0;i--) 31 printf("%0.8lld",a[i]); 32 }