分析 : 搞成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; }