解法一:
int next_n(int n){//把n一个数字一个数字的拆出来,这个方式可以避免异位
int r = 0;
while(n!=0){
int d = n%10;
n = n/10;
r = r + d*d;
}
}
bool contains(int* history,int size,int n){
for(int i=0;i<size,i++){
if(history[i]==n)
return true;
}
return false;
}
bool isHappy(int n){
int history[1000];//int类型的数最多10位,最大的数是是个9,计算后是81*10,
int size=0;
while(!contains(history,size,n)){
history[size]=n;
size++;
n=next_n(n);
}
return n==1;
}
解法二:
思想为:龟兔赛跑,在一个环状的跑道中,兔子和乌龟在同一起点出发,兔子每秒1米,乌龟每秒0.5米,当乌龟和兔子相遇时,就是算法中第一次出现相同n的时候。
int next_n(int n){//把n一个数字一个数字的拆出来,这个方式可以避免异位
int r = 0;
while(n!=0){
int d = n%10;
n = n/10;
r = r + d*d;
}
}
bool isHappy(int n){
int fast=n;
int slow=n;
do{
slow=next_n(slow);
fast=next_n(next_n(fast));
}while(slow!=fast);
return fast==1;
}