背景
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; }