HDU 1042 N!

高精度阶乘问题

以前从没做过高精度的问题 上午做的时候把高精度的加减乘都看了一遍 大概了解了下怎么做

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1042

这个是看着乘法比着写的

1、判断乘后大数的位数,此题约为40000;
2、选择由那种类型数组存储,一般由int存储,一个数能存5位(10000*100000<2^31);
3、确定数组长度,此题约为40000/5=8000;
4、计算数组中每个数与普通数的乘积并存入数组;
5、计算数组中每个数乘普通数的进位,加入高一位数组;
6、输出时先计算使用了多少个的数组,然后向前输出数组。

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define max 8001
 4 unsigned n,a[max];
 5 int main()
 6 {
 7     while(~scanf("%d",&n))
 8     {
 9         int i,j;
10         memset(a,0,sizeof(a));
11         for(i=2,a[0]=1;i<=n;i++)
12         {
13             for(j=0;j<max;j++) a[j]*=i;    
14             for(j=0;j<max;j++)
15             {
16                 a[j+1]+=a[j]/100000;
17                 a[j]%=100000;
18             }
19         }    
20         for(i=max-1;i>=0&&!a[i];i--);
21         printf("%d",a[i--]);
22         for(;i>=0;i--) printf("%05d",a[i]);
23         printf("\n");
24     }
25     return 0;
26 }

 

 

posted @ 2012-07-16 23:09  时光旅行的懒猫  阅读(155)  评论(0编辑  收藏  举报