L2-029 特立独行的幸福

传送门

解题思路

本题难在对题意的理解。想要ac这道题,我们需要搞清楚\(2\)个东西,一个是迭代结果,一个是根,由题目可知,只有根才能被称作幸福数,而迭代结果是中间值,如果一个幸福数是别人的迭代结果或者说是一个中间值,那么他不是特立独行的幸福数。

我们需要实现以下功能:

  1. 不断地迭代,直到值为1,在这个过程中我们需要把所有经历过的点记为true(防止死循环),还需要一个变量来存乘积,如果最后乘积为1,就是幸福数

  2. 判断一个幸福数是否是 特立独行 的幸福数,如果这个幸福数是别人的迭代结果(中间值),那么就失败了,因此我们要在迭代的时候,记录中间值,把出现过的乘积都记为true,或者用一个计数数组。最后遍历区间,如果既是幸福数,又不是中间值,就放进答案数组里,准备输出。

  3. 统计迭代结果的个数

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;
}

😴

posted @ 2026-03-16 20:47  shuiwangrenjia  阅读(0)  评论(0)    收藏  举报