ACM-大数之N!――hdu1042

2014-11-24 10:10:37 · 作者: · 浏览: 2

N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 48915 Accepted Submission(s): 13747
Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input One N in one line, process to the end of file.
Output For each N, output N! in one line.
Sample Input 1 2 3
Sample Output 1 2 6
这道题题意很简单,就是大数的乘法,N的阶乘, 你也看到题目中 N可能到达10000, 所以,即使用Long long也是望尘莫及的。 这道题的方法就是: 建立一个整形数组,每个数组存五位数,大于五位的 num/100000进位,num%100000存起来 这道题的依据就是加法和乘法的分配率,用分段相乘: 1234*11=11*(12*10^2+34)=11*12*10^2+11*34, 上面是如果一个数组内存两位,存五位也是类似的。
还要注意两点: ①. 在乘的时候末尾可能出现很多0的情况,所以,什么时候要向前算判定要清楚 ②. 在最后输出的时候,除了最高位的不用补0,其他位数的都需要补0 第二个方法我用的是C的printf解决。
//N!


#include 
   
    
#include 
    
      int arr[8001],k; int main() { int i,j,n,jinwei; int num; while(scanf("%d",&n)!=EOF) { memset(arr,0,sizeof(arr)); arr[0]=1; k=0; // 从1到n循环 for(j=1;j<=n;++j) { jinwei=0; for(i=0;i<=k;++i) { num=arr[i]*j+jinwei; if(num>99999) jinwei=num/100000; else jinwei=0; arr[i]=num%100000; // 如果到了最高位,仍有进位 if(i==k && jinwei!=0) { ++k; arr[k]=jinwei; break; } } } // 注意格式,第一个输出的不需要补0,后面需要补0 for(i=k;i>=0;--i) if(i==k) printf("%d",arr[i]); else printf("%05d",arr[i]); printf("\n"); } return 0; }