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 }

 

posted @ 2016-08-17 20:15  Crazy、baby  阅读(220)  评论(0编辑  收藏  举报