题目名字
[题目链接]https://pintia.cn/problem-sets/994805046380707840/problems/1111914599412858886
题意
对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2×4=8
思路
- 先把数不断分解,并且确定是不是死循环,如果不在区间内就不是幸福数
- 判断是否素数是的话*2
- 输出
坑点
- 无
算法一:XX+XX
实现步骤
- 写两个函数,一个分解数字,一个判断素数;
- 判断分解的数是不是等于1,是素数再乘2,并且记录这个数和她的幸福值
- 输出
代码
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> v1,v;
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)//找到存在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;
}