n的阶乘定义为n!=1*2*3*……*n 如3!=6
n!通常最后会有很多0,如5!=120 最后有一个0,现在统计n!去除末尾的0后,最后k位是多少
使用高精度乘以单精度,但只保留20位就可以了。
还要去掉末尾的0.
#include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> using namespace std; int n,k; int ans[21],c[21]; int main() { scanf("%d%d\n",&n,&k); ans[1]=1; ans[0]=1; for (int i=2;i<=n;i++) { ans[1]=ans[1]*i; for (int j=2;j<=min(19,ans[0]);j++) { ans[j]=ans[j]*i; ans[j]+=ans[j-1]/10; ans[j-1]%=10; } while (ans[ans[0]]>=10) { if (ans[0]==19) {ans[ans[0]]%=10;break;} ans[++ans[0]]=ans[ans[0]-1]/10; ans[ans[0]-1]%=10; } int s=1; while (ans[s]==0&&s<20) s++; if (s!=1) for (int j=s;j<20;j++) ans[j-s+1]=ans[j]; ans[0]=19; while (ans[ans[0]]==0) ans[0]--; } for (int i=k;i>0;i--) printf("%d",ans[i]); printf("\n"); return 0; }