leetcode #202.快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
/**
* 题目:202.快乐数
* author:Whywait
* 方法一:递归法
* 具体步骤:
1.return语句有二:一为返回false;二为返回true。
2.将数字的每个数位上的数字放到辅助数组中,为求每个数位上的平方和做准备。
3.求平方和。如果平方和为1,则返回true;否则,将sum带入isHappy()再次调用函数。
* 原因解释:
问:为什么返回false的错误语句的判断条件为 n < 10 && n != 1 && n != 7 呢?
答:因为在 n < 10 的9个数中,只有1和7为开心数。
所有数字在不断的 isHappy() 过程中,终究会出现一个小于10的正整数,
如果非1或者非7,则定不为开心数,一直死循环下去,不如跳出苦海,返回false。
*/
bool isHappy(int n) {
if (n < 10 && n != 1 && n != 7) return false;
int num[100] = { 0 }; int temp = 0;
while (n > 9) {
num[temp++] = n % 10;
n = (n - num[temp - 1]) / 10;
}
num[temp++] = n;
int sum = 0;
for (int i = 0; i < temp; i++)
sum += num[i] * num[i];
if (sum == 1) return true;
else return isHappy(sum);
}
其他方法
/**
* 方法二:使用set
* 具体步骤:
* 如果数未曾不被集合包含,则加入集合,直到出现1(返回true);
如果集合中已有该数(出现循环),返回false;
*/
/**
* 方法三:快慢指针
* 具体步骤:
* 1. 每次快指针走两步,慢指针走一步
* 2. 快指针为1,则返回true(快指针总是比慢指针先到达某个数)
* 3. 快指针追上慢指针(出现循环),则返回false
*/