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 }