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;
}
浙公网安备 33010602011771号