天梯赛L2-029 特立独行的幸福
题目详情:
输入样例 1:
10 40
输出样例 1:
19 8
23 6
28 3
31 4
32 3
思路:
这个题也是借鉴了网上大佬的写法
这个题是求特立独行的幸福数和它的独立性,因为每个区间有很多幸福数,所以题目中给出了依附的定义。
我暂且把幸福数经过迭代变成1的过程中出现的数叫做过程数。
这个题就是说从A到B的过程中,每个数肯定都要经历一次判断,而且这个数不是幸福数就是循环数,首先肯定是要先求它的过程数(写一个函数),注意这里求的是区间内的过程数接下来就是循环一遍所有的数而且每个数都要进行一次迭代求它的过程数:
先判断过程数是不是1?
如果不是1,再判断是不是循环数,如何再存入v容器中。
那么第一种情况<如果是循环数呢>:那么v容器中肯定<先存入了第一次出现的数>,
所以<利用find函数>判断这个数是否在v容器中出现过<如果出现过>就证明它是循环数,直接进行下一次循环。
如果是幸福数呢:那么在过程数等于1的时候,首先把<这个等于1的过程数的初始数>标记为特立独行的幸福数。
而等于1之前肯定还是会有过程数存入v容器中,那么就将<这些过程数>都标记为不是特立独行的幸福数,并且<这些过程数>都是<依附于初始数的>
所以这个时候v容器的大小+1就是独立性的大小
如果这里看不懂没关系,结合代码去看就好啦。
详细代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
int happynum(int u)//十进制数的各位数字做一次平方和
{
int sum = 0;
while(u)
{
int a = u%10;
sum += a*a;
u = u/10;
}
return sum;
}
bool isprime(int u)//判断素数
{
for(int i=2; i<sqrt(u); i++)
{
if(u % i == 0)
return false;
}
return true;
}
int visit[maxn];//特立独行幸福数为1,不特立独行幸福数为-1
int a,b;
vector<int>v;//存放依附于初始数字的幸福数
int num[maxn];//独立数
int main()
{
cin>>a>>b;
for(int i=a; i<=b; i++)
{
int sum = i;//要先把i赋给sum,再用sum去迭代,否则用i迭代就不能标记i了
if(visit[i] == -1)
continue;
while(1)
{
sum = happynum(sum);//递归求出每次的过程数
if(sum == 1)//如果是幸福数
{
visit[i] = 1;
for(auto it=v.begin(); it!=v.end(); it++)//迭代器,把在v容器中的过程数都视为不是特立独行的
visit[*it] = -1;
num[i] = v.size() + 1;//把自己也要算上
v.clear();//进行下次循环前把v清空
break;
}
if(find(v.begin(),v.end(),sum) != v.end())//如果在v中找到了当前的sum,证明他是循环的数,不是幸福数
{
v.clear();//直接清空v容器,进行下次循环
break;
}
v.push_back(sum);//将这个数的过程数存入v中
}
}
int flag = 0;//是否有特立独行幸福数的标志
for(int i=a; i<=b; i++)
{
if(visit[i] == 1)
{
cout<<i<<" ";
if(isprime(i))
cout<<num[i]*2<<endl;
else
cout<<num[i]<<endl;
flag = 1;
}
}
if(!flag)
cout<<"SAD";
}
知识总结:
知识点就还是STL容器中的vector容器,主要是思路。这个题目说白了还是和水仙花数一类的东西,还是数学性强一点吧。