【高精度】SSL 1117 N!

大意

n <= 100 的阶乘

思路

高精度模拟

代码

#include<cstdio>
#include<cstring>
#define N 1001
using namespace std;char c;int fact[101][N+1],n;
void Get_fact(int n)
{
    fact[0][1]=1;fact[1][1]=1;
    int m=0,l=0,x,a[N+1]={0};
    for(int i=2;i<=n;i++)
    {
        x=i;m=0;
        while(x) a[++m]=x%10,x/=10;//将a转换成数组,以便高精乘高精,这样子是方便处理更大的数据
        for(l=N;!fact[i-1][l];l--);
        for(int j=1;j<=l;j++)
        {
            int g=0;
            for(int k=1;k<=m;k++)
            {
                fact[i][j+k-1]+=fact[i-1][j]*a[k]+g;
                g=fact[i][j+k-1]/10;
                fact[i][j+k-1]%=10;
            }
            fact[i][j+m]=g;//处理最终进位
        }
    }
    return;
}
void print(int a[],int size)//输出一个数组
{
    int j;
    for(j=size;!a[j]&&j>1;j--);
    for(int i=j;i>0;i--) putchar(a[i]+48);
    return;
}
signed main()
{
    scanf("%d",&n);
    Get_fact(n);
    print(fact[n],N-1);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81667377