看其他大佬的。
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;
}
标签:幸福,int,特立独行,st,L2,ans,visited,029
From: https://www.cnblogs.com/chengyiyuki/p/18083853