题意:
Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number
- 12 + 92 = 82
- 82 + 22 = 68
- 62 + 82 = 100
- 12 + 02 + 02 = 1
这是一道新题, 我的想法是直接模拟,到1就返回,如果进入了一种循环,那就永远到不了1了。怎么去检测这个循环是一个问题,点开tags,里面写着分类是hashtable,突然觉得只要记录过程中出现过的每一个平方和就可以了。这个平方和的范围可以估计一下,int型数的范围32位下上限是4294967296,也就是10位,9*9*10的话也才810,我开一个1000的数组就可以完成这个工作了。
整个模拟过程就是,
1.对每一个循环的当前数字求各位平方和
2.如果平方和等于1,那么返回true
3.如果平方和不为1,去标记数组中寻找,如果出现过,说明出现循环了,返回false
4.把这个下标的数组元素做标记,表示出现过了
下面上代码:
public static boolean isHappy(int n) {
int[] hash = new int[1000];
for(int i=0;i<1000;i++){
hash[i] = 0;
}
int m = n;
boolean flag = false;
while(true){
m=getSum(m);
if(m==1){
flag = true;
break;
}else if(hash[m]==1||m==n){
break;
}
hash[m] = 1;
}
return flag;
}
public static int getSum(int n){
int sum = 0;
while(n>0){
int t = n%10;
sum += t*t;
n /= 10;
}
return sum;
}