L2-029 特立独行的幸福
解题思路
本题难在对题意的理解。想要ac这道题,我们需要搞清楚\(2\)个东西,一个是迭代结果,一个是根,由题目可知,只有根才能被称作幸福数,而迭代结果是中间值,如果一个幸福数是别人的迭代结果或者说是一个中间值,那么他不是特立独行的幸福数。
我们需要实现以下功能:
-
不断地迭代,直到值为1,在这个过程中我们需要把所有经历过的点记为true(防止死循环),还需要一个变量来存乘积,如果最后乘积为1,就是幸福数
-
判断一个幸福数是否是 特立独行 的幸福数,如果这个幸福数是别人的迭代结果(中间值),那么就失败了,因此我们要在迭代的时候,记录中间值,把出现过的乘积都记为true,或者用一个计数数组。最后遍历区间,如果既是幸福数,又不是中间值,就放进答案数组里,准备输出。
-
统计迭代结果的个数
ac✅️代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
bool vis[10010];//该数之前是否出现过
bool is_happy[10010];//是否是幸福数
int cnt[10010];//每个数出现的次数
int ans[10010];//独立性
bool isPrime(int x)
{
for(int i = 2; i <= x / i ; i++)
{
if(x % i == 0) return false;
}
return true;
}
int evol(int u)
{
int sum = 0;
while(u)
{
sum += (u%10) * (u%10);
u/=10;
}
return sum;
}
int check(int u)
{
memset(vis,0,sizeof vis);
int count = 0;
int cur = u ;
while(cur != 1 && vis[cur] != true)
{
vis[cur] = true;
cur = evol(cur);
count ++;
cnt[cur] ++;
}
if(cur == 1) return count;
return -1;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i = n ; i <= m ; i++)
{
int cur = check(i);
if(cur != -1)
{
is_happy[i] = true;
ans[i] = cur;
}
}
bool suc = false;
for(int i = n; i <= m ; i++)
{
if(is_happy[i] && cnt[i] == 0)
{
suc = true;
int cur = ans[i];
if(isPrime(i) ) cur *= 2;
cout<<i<<" "<<cur<<endl;
}
}
if(!suc) cout<<"SAD\n";
return 0;
}
😴

浙公网安备 33010602011771号