题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1042
想一下10000!一定非常大结果不能一次性输出,所以我们可以采用数组来保存结果;
eg:100!=100*99*98*...*2*1;
我们可以让9900*98...可以转换成大整数乘小整数;
结果假如是:12 3456 7890;
a[0]=7890;a[1]=3456;a[0]=12;
具体过程如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<queue> 6 #include<cstdlib> 7 #include<cstring> 8 using namespace std; 9 #define maxn 10010 10 11 int a[maxn];//每个元素里存4位;不然10000的阶乘位数太多会超限; 12 13 void PUL(int a[],int k) 14 { 15 for(int i=0; i<maxn; i++) 16 { 17 a[i]=a[i]*k; 18 } 19 for(int i=0; i<maxn; i++) //进行进位,保证每个元素都含有4位 20 { 21 a[i+1]+=a[i]/10000; 22 23 a[i]%=10000; 24 } 25 } 26 27 void PUT(int a[]) 28 { 29 int len; 30 31 for(int i=maxn-1; i>=0; i--) 32 { 33 if(a[i]!=0) 34 { 35 len=i; 36 break; 37 } 38 } 39 printf("%d",a[len]);//末位单独输出;eg:12 0000 0000; 40 for(int i=len-1; i>=0; i--) 41 { 42 printf("%04d",a[i]); 43 } 44 cout<<endl; 45 } 46 int main() 47 { 48 int n; 49 50 while(cin>>n) 51 { 52 memset(a,0,sizeof(a)); 53 54 a[0]=1;//0!=1; 55 56 for(int i=1; i<=n; i++) 57 { 58 PUL(a,i); 59 } 60 PUT(a); 61 } 62 return 0; 63 }