题目:求n的阶乘(1<=n<=10000)链接
思路:手算模拟,总共分成m段,每个段8位数字,存在m个变量中,这样可以防止溢出,c可以理解为进位。输出的时候最低位可能是0,所以不能直接输出一个0,而要补齐8位。
#include<cstdio>
#include<queue>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<set>
#include<stack>
#include<algorithm>
#define cle(a) memset(a,0,sizeof(a))
#define inf(a) memset(a,ox3f,sizeof(a))
#define ll long long
#define Rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int INF = ( 2e9 ) + 2;
const int maxn = 100000000;
int main()
{
int n; // 求n的阶乘 n= 10000;
scanf("%d",&n);
ll a[100000];
ll c=0;
int m=0;
a[0]=1;
for(int i=1;i<=n;i++)
{
c=0;
for(int j=0;j<=m;j++)
{
a[j]=a[j]*i+c;
c=a[j]/maxn;
a[j]%=maxn;
}
if(c>0)
{
m++;
a[m]=c;
}
}
printf("%lld",a[m]);
for(int i=m-1;i>=0;i--)
printf("%0.8lld",a[i]); // 如果最低位为0,那么用0补满8位
printf("\n");
}