这里思考一个问题:他如果是无限循环,那么他就一直被困在了while中,怎么得出false呢?
要想到,这里必须要用到set,如果他发生了无限循环,那么sum值一定会重复出现,所以只要sum重复出现了,那么就说明进入了死循环。这个时候就return false。
bool isHappy(int n) { int sum; int arr[1000] ={0}; string s = to_string(n); unordered_set<int> set; while (true) { for (int i = 0; i < s.size(); ++i) { //如果不写 s[i]-'0' 直接写arr[i] = s[i]。字符转化为数字时就出现了问题。字符 s[i] 被赋值给整型数组 arr[i],但是 arr[i] 的类型是整型而不是字符型,因此赋值时字符会被隐式地转换为它的 ASCII 码值。如果想要将字符转换为对应的数字,应该将字符减去字符 '0',这样得到的结果就是该字符所表示的数字。 arr[i] = s[i] - '0'; 也就是说,要想把char转化为int,就要用char - '0'。 } for (int i = 0; i < s.size(); ++i) { sum += arr[i] * arr[i]; } if (sum == 1) return true; if(set.find(sum) != set.end()) return false; //发生无限循环的判断 set.insert(sum); s = to_string(sum); sum = 0; } }