N! 高精度算法。
核心思路:
将大数拆分开存进数组里面,Hdu 1042这题的要求是 0<= N <= 100000 。所以100000为一个分界点。例如:
9! = 362880 ,要将3存进一个数组,62880存进一个数组。
10!= 3628800 ,此时右数组内容变为628800大于100000了,右边依然拆分进位,把6进位,保留28800 。左数组也乘以10,然后加上进位,即3*10+6=36 。
所以二次拆分进位之后左数组是36,右数组是28800 。
让左右都大于100000 时,都要进位。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define max 1000
int a[max];
int main()
{
int n,c;
int i,j,cnt;
while(cin>>n){
memset(a,0,sizeof(a));
a[0]=1;
cnt=0;
for( i=1;i<=n;i++){
c=0;
for( j=0;j<=cnt;j++){
a[j]=a[j]*i+c;
c=a[j]/100000;
a[j]=a[j]%100000;
}
if(c!=0){
cnt++;
a[cnt]=c;
}
}
cout<<a[cnt];
for(i=cnt-1;i>=0;--i){
cout<<a[i];
}
cout<<endl;
}
return 0;
}