Sample Input 4 1 1 2 7 3 383 4 1000
Sample Output 1 1 NO 2 7 YES 3 383 YES 4 1000 NO
题意:确定这个数是不是happy数。条件一是必须为素数,二是每个位数上的数的平方和只要不是等于一就继续拆解直到为1,如果无法得到1则也不满足。
思路:判断素数好写,在求平方和的时候把每一次出现过的数记下来,如果再次出现则不满足。(有人用循环次数来判断,如果拆解平方和大于10次则最后永远不可能得到1)
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
typedef long long LL;
using namespace std;
int mp[10010];
int prim(int n)
{
if(n==1)
return 0;
int t=1;
for(int i=2; i<=sqrt(n); i++)
{
if(n%i==0)
{
t=0;
break;
}
}
return t;
}
int main()
{
int t,flag;
cin>>t;
while(t--)
{
memset(mp,0,sizeof(mp));
int k,m,s,mm;
cin>>k>>m;
if(prim(m)==0)
{
cout<<k<<" "<<m<<" "<<"NO"<<endl;
}
else
{
mm=m;
flag=1;
while(1)
{
s=0;
while(mm)
{
s+=(mm%10)*(mm%10);
mm/=10;
}
mm=s;
if(s==1)
{
break;
}
if(mp[s]==0)
mp[s]++;
else
{
flag=0;
break;
}
}
if(flag==1)
cout<<k<<" "<<m<<" "<<"YES"<<endl;
else
cout<<k<<" "<<m<<" "<<"NO"<<endl;
}
}
return 0;
}