写一个算法来判断一个数是不是“快乐数”。
一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
案例: 19 是一个快乐数。
- 12 + 92 = 82
- 82 + 22 = 68
- 62 + 82 = 100
- 12 + 02 + 02 = 1
最开始的想法,出现无限循环报异常就说明该数不是快乐数,那么用java的异常捕获try...catch...语句来返回false即可。
但是这样处理耗时太长。
应该没有人会像我这样写的吧,这样似乎太蠢了,不开心
public boolean isHappy(int n){ if(n<=0){ return false; } int temp = n; int res = 0; try{ while(temp%10!=0||temp/10!=0){ res += Math.pow(temp%10,2); temp = (temp-temp%10)/10; } if(res!=1){ boolean flag = isHappy(res); return flag; } return true; }catch (StackOverflowError e){ return false; } }
怀着追求完美的心,我好好研究了一下快乐数,终于发现:个位数中只有两个快乐数,那就是1和7(看来单身的人快乐的真的是不多啊)。于是就有了一下的解法(对之前的写法也做了优化)。
public boolean isHappy(int n) { while (n == 7 || n >= 10) { int t = 0; while (n != 0) { t += Math.pow((n % 10), 2); n /= 10; } n = t; } return n == 1; }