一、题目
二、解题思路
- 定义两个集合:set<int> any[10005] 存储闭区间内每一个数的判断过程,例如,当循环到数字19 时,any[19] 会依次 insert 82、68、100、1 ;当循环到数字 29 时,any[29] 会依次 insert 85、89、145、42、20、4、16、37、58、89。set<int> all 存储所有数的判断过程。
- 一个数的迭代终止条件:数字更新为 1 或者更新的数字在 any[i] 中存在, (t==1 || any[i].count(t)==1) 。
- 幸福数:any[i] 中存在 1 ,any[i].count(1)==1 。
- 特立独行:在 all 中不存在,all.count(i)==0 。
三、代码
#include<iostream>
using namespace std;
#include<set>
#include<cmath>
int sum(int x);
bool prime(int x);
int main()
{
int a,b;
set<int> any[10005];
set<int> all;
cin>>a>>b;
for(int i=a;i<=b;i++)
{
int t=sum(i);
while(1)
{
any[i].insert(t);
all.insert(t);
t=sum(t);
if(t==1 || any[i].count(t)==1)
{
any[i].insert(t);
all.insert(t);
break;
}
}
}
bool flag=true;
for(int i=a;i<=b;i++)
{
if(any[i].count(1)==1 && all.count(i)==0)
{
flag=false;
cout<<i<<" ";
if(prime(i))
{
cout<<any[i].size()*2<<endl;
}
else
{
cout<<any[i].size()<<endl;
}
}
}
if(flag)
{
cout<<"SAD";
}
return 0;
}
//对一个十进制数的各位数字做一次平方和
int sum(int x)
{
int s=0;
for(int i=1;x/i>0;i*=10)
{
s+=pow(x/i%10,2);
}
return s;
}
//判断是否是质数
bool prime(int x)
{
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
四、总结
利用集合的 count() , size() 函数。