输入不超过1000的正整数n,输出n!=1x2x3......xn的精确结果
输入:30
输出:265252859812191058636308480000000
分析:
1.平常用迭代计算阶乘,不能计算高位阶乘,因为会超过int值的范围,long long也不能满足;
2.因此要手动模拟计算,依次模拟计算1x2,1x2x3......1x2x3...n
3.用一个高维数组fact[MAX]存储阶乘值,且低位依次存储,即:fact[0]存储个位,fact[1]存储十位......这样可以方便进位处理;
4.进位处理过程:假设fact存储值依次为:fact[0], fact[1], fact[2]...fact[k](fact[0]为个位,fact[1]为十位....),此时乘数是i,即乘以i; 从fact[0]到fact[k]依次处理:
假设buf=fact[j]*i+ans(其中ans为前一位的进位,初始为0),则当前fact[j]=buf%10;向高位进位为ans=buf/10。
#include<iostream>
#include<cstring>
#define MAX 5000
using namespace std;
int fact[MAX];
int main()
{
int n;
while(cin>>n)
{
memset(fact,0,sizeof(fact));
fact[0]=1;
int ans=0;
for(int i=2;i<=n;i++){
for(int j=0;j<MAX;j++){
int buf=fact[j]*i+ans;
fact[j]=buf%10;
ans=buf/10;
}
}
int pos;
for(pos=MAX-1;pos>=0;pos--) if(fact[pos]) break;
for(int i=pos;i>=0;i--) cout<<fact[i];
cout<<endl;
}
return 0;
}