背景
Zhang Gangrui 年纪大了,记性不好,保险箱的密码记不住了,他只记得密码是一个数的阶乘各个位的数相加的和,最后还有个T或F,
代表这个数是否为素数,正好,你到他家去了,他请你帮他这个忙,并答应事成之后给你100000000 MOD 10 RMB。
描述
输入一个整数n(1000>=n>=0)
输出n的阶乘各个位的数相加的和y,最后再输出T或F,
代表y是否为素数。
格式
输入格式
输入一个整数n(1000>=n>=0)
输出格式
输出n的阶乘各个位的数相加的和y,最后再输出对y是否为素数的判断,
是为T否为F。
题解
高精度乘法和素数判断。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define mod 10007
#define N 10000
#define ll long long
using namespace std;
int n;
struct shu{int s[500],l;} a,b,c;
int ans;
shu operator * (const shu &x,const shu &y)
{
shu ans;
memset(ans.s,0,sizeof(ans.s));
int i,j;
for(i=1;i<=x.l;i++)
for(j=1;j<=y.l;j++)
ans.s[i+j-1]+=x.s[i]*y.s[j];
ans.l=x.l+y.l-1;
for(i=1;i<=ans.l;i++)
{if(ans.s[i]>=N)
{ans.s[i+1]+=ans.s[i]/N;
ans.s[i]%=N;
}
}
i=ans.l+1;
while(ans.s[i]>0)
{if(ans.s[i]>=N)
{ans.s[i+1]+=ans.s[i]/N;
ans.s[i]%=N;
}
i++;
}
ans.l=i-1;
return ans;
}
void calcu()
{
int i,j;
c.s[1]=1; c.l=1;
for(i=2;i<=n;i++)
{a=c;
b.s[1]=i; b.l=1;
c=b*a;
}
for(i=1;i<=c.l;i++)
for(j=1;j<=4;j++)
{ans+=c.s[i]%10;
c.s[i]/=10;
}
printf("%d",ans);
}
void check()
{
int i;
for(i=2;i<=sqrt(ans);i++)
{if(ans%i==0) {puts("F"); return;}}
puts("T");
}
int main()
{
scanf("%d",&n);
calcu(); check();
return 0;
}