分析 : 搞成1000000进制计算类似于竖式乘法的感觉(实际上到100000000也是可以的),注意要开ll
code :
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
ll num[maxn];
void solve(ll n)
{
    memset(num,0,sizeof(num));
    num[1]=1;
    ll dig=1,carry;
    for(ll i=2;i<=n;i++) {
        carry=0;//这里容易忘记初始化
        for(ll j=1;j<=dig;j++) {
            num[j]=i*num[j]+carry;
            carry=num[j]/1000000;
            num[j]%=1000000;
        }
        if(carry) num[++dig]=carry;
    }
    printf("%lld",num[dig]);
    for(ll i=dig-1;i>=1;i--) printf("%06lld",num[i]);
    printf("\n");
}
int main()
{
    ll n;
    while(~scanf("%lld",&n)) solve(n);
    return 0;
}
搞个10000就不用ll了,wa了很久,居然没发现,其实是先用这个代码过的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 5;
int num[maxn];
void solve(int n)
{
    memset(num,0,sizeof(num));
    num[1]=1;
    int dig=1,carry;
    for(int i=1;i<=n;i++) {
        carry=0;
        for(int j=1;j<=dig;j++) {
            num[j]=i*num[j]+carry;
            carry=num[j]/10000;
            num[j]%=10000;
        }
        if(carry) num[++dig]=carry;
    }
    printf("%d",num[dig]);
    for(int i=dig-1;i>=1;i--) printf("%04d",num[i]);
    printf("\n");
}
int main()
{
    int n;
    while(~scanf("%d",&n)) solve(n);
    return 0;
}