#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
/*
多益网络笔试编程题 梦幻数
输入一个数字n 将其按各个位上的数反复展开 用平方和代替这个n 直到最后结果为1时 则为梦幻数
例如
输入: 19
展开: 1^2+9^2 = 82
8^2+2^2 = 68
6^2+8^2 = 100
1^2+0^2+0^2 =1
结果: 19为梦幻数
其他数字可以自行展开尝试
*/
/*
把数字n各个位上的拆出来放入数组nums中并且返回
*/
vector<int> fun(int n) {
vector<int> nums;
while (n) {
nums.insert(nums.begin(), n % 10);
n /= 10;
}
return nums;
}
//如果一个数为非梦幻数,应该总会有一个完全平方和的结果在前面重新出现过
//所以用一个hash表来记住已经出现过的平方和结果
//如果再次出现就停止循环 返回false
bool isDreamNum(int n) {
if (n < 0) return false;
unordered_map<int, int> map;
map[n]++;
while (n!=1)
{
int temp = 0;
vector<int> nums = fun(n);
for (int i = 0; i < nums.size(); i++) {
int x = nums[i];
temp += x * x;
}
n = temp;
if (map[n] > 1)
return false;
map[n]++;
}
return true;
}
int main() {
int n;
cin >> n;
if (isDreamNum(n)) {
cout << "梦幻数"<<endl;
}
else {
cout << "非梦幻数" << endl;
}
system("pause");
return 0;
}