题目描述:
![](https://i-blog.csdnimg.cn/blog_migrate/919aefa2c09d97a575097a24f840a35c.png)
样例:
![](https://i-blog.csdnimg.cn/blog_migrate/2bc58984c702e25390ee440ce4cc26a0.png)
题目分析:
考虑到题目变量的范围,在1e4以内,所以这道题只是简单的模拟分析就行了
注意:这道题有两个记录数组很重要,分别是flagn数组和flag数组,flagn数组用来记录在A到B区间内的一个数例如ai是否在A到B的区间内出现过,如果出现了,那么这个数就不是幸福数,如果没有出现,那就符合条件;另外,flag数组用来在判断一个数是不是幸福数的时候标记循环。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int flagn[maxn] = {0};
int getnum(int x)
{//得到这个数的下一个数
int sum = 0;
while(x > 0)
{
sum += (x % 10) * (x % 10);
x /= 10;
}
return sum;
}
bool isprime(int x)
{
if(x == 1 || x == 0)
{
return false;
}
for(int i=2;i<=sqrt(x);i++)
{
if(x % i == 0) return false;
}
return true;
}
vector<int> v,v1;
int main()
{
int a,b;
cin >> a >> b;
for(int i=a;i<=b;i++)
{
int x = i;
int sum = 0;
int flag[maxn] = {0};
while(1)
{
x = getnum(x);
sum++;
if(x == 1)
{
if(isprime(i)) sum *= 2;
v1.push_back(i);
v.push_back(sum);
break;
}
if(flag[x]) break;//循环出现,直接下一位
flag[x] = 1;
flagn[x] = 1;
}
}
if(v1.size() == 0)
{
cout << "SAD" << endl;
return 0;
}
for(int i=0;i<v1.size();i++)
{
if(!flagn[v1[i]])
cout << v1[i] << " " << v[i] << endl;
}
return 0;
}