L2-029 特立独行的幸福

看其他大佬的。
10,13这些是幸福数,在开始会设置为特立独行的幸福数,但是他们并不是特立独行而是其他数字变换而来的,所以在设置那个数字的时候10,13会被修正为普通的幸福数。

#include <bits/stdc++.h>
using namespace std;
int visited[10010];//记录那些是幸福数
int record[10010];//记录独立性
int getbs(int x) {
	int res = 0;
	while (x) {//x不是0
		int left = x % 10;
		x /= 10;
		res += left * left;
	}
	return res;
}
bool isPrime(int x) {
	if (x == 1) return false;
	for (int i = 2; i <= sqrt(x); i++) {
		if (x % i == 0) return false;
	}
	return true;
}
int main() {
	int a, b;
	cin >> a >> b;
	for (int i = a; i <= b; i++) {
		set<int> st;//容器经过的数字
		int j = i;
		if (visited[j] == -1) continue;
		while (true) {
			int ans = getbs(j);//过程数
			//如果是幸福数
			if (ans == 1) {
				visited[i] = 1;//说明容器里面都是特立独行的幸福数
				for (set<int>::iterator it = st.begin(); it != st.end(); ++it) {
					visited[*it] = -1;//都是幸福数
					record[*it] = 0;
				}
				record[i] = st.size() + 1;
				break;
			}
			if (st.find(ans)!=st.end()) {//如果循环
				//不用特意设置visited了按照默认的0就行了
				break;
			}
			st.insert(ans);
			j = ans;
		}
	}
	//遍历特立独行
	int flag = 1;
	for (int i = a; i <= b; i++) {
		if (visited[i] == 1) {
			flag = 0;
			if (isPrime(i)) {
				printf("%d %d\n", i, record[i]*2);
			}
			else {
				printf("%d %d\n", i, record[i]);
			}
		}
	}
	if (flag) cout << "SAD" << '\n';
	return 0;
}
posted @ 2024-03-19 20:08  YuKiCheng  阅读(16)  评论(0编辑  收藏  举报