http://www.51nod.com/Challenge/Problem.html#!#problemId=1057
正常的可以直接通过模拟来求阶乘,用一个数组保存阶乘的每一位。
但是当n太大的时候,就不行了。
所以这里用每8位进位的方法,就是数组中的每一个数都保存8位数,超过八位数才进位。
#include <iostream>
#include <cstdio>
#include <cmath>
typedef long long ll;
using namespace std;
const int MAXN = 1e8;
int main(){
int n,g,len;
ll a[100000];
scanf("%d",&n);
a[0] = 1,len = 0;
for(int i=2;i<=n;i++){ //2--n
g = 0;
for(int j=0;j<=len;j++){
a[j] = a[j] * i + g; //每位乘上i
g = a[j] / MAXN; //每MAXN才进位
a[j] %= MAXN;
}
if(g != 0){
a[++len] = g;
}
}
printf("%lld",a[len]); //要先把最后进位的输出
for(int i=len-1;i>=0;i--){
printf("%08lld",a[i]); //每1e8才进位,所以不够8位的要补前导0
}
printf("\n");
return 0;
}