boolisHappy(int n){// 哈希表。int hash[500]={0};while(n !=1){int sum =0;// 各个位数求平方和。while(n >0){int d = n %10;
n = n /10;
sum += d*d;}// 判断是否陷入死循环。if(hash[sum]==0){
hash[sum]=1;
n = sum;}elsereturnfalse;}returntrue;}
uthash
// uthash。boolisHappy(int n){struct hash {int value;// makes this structure hashable.
UT_hash_handle hh;};struct hash *hashTable =NULL;int sum =0;while(n !=1){// 各个位数求平方和。while(n >0){int d = n %10;
n = n /10;
sum += d*d;}struct hash *h;// 查找值。HASH_FIND_INT(hashTable,&sum, h);if(h)returnfalse;else{
h =malloc(sizeof(struct hash));
h->value = sum;// 若值不存在则添加。HASH_ADD_INT(hashTable, value, h);
n = sum;
sum =0;}}returntrue;}
数学方法
boolisHappy(int n){while(n !=1){int sum =0;while(n >0){int d = n %10;
n = n /10;
sum += d*d;}// 判断是否进入上述死循环。if(sum ==4)returnfalse;
n = sum;}returntrue;}
数学方法优化 | 已知 2、3、4、5、6 都不是快乐数,1、7是快乐数。
boolisHappy(int n){while(n >6){int sum =0;while(n >0){int d = n %10;
n = n /10;
sum += d*d;}// 若 n <= 6 则跳出循环,此时若 n == 1,则为快乐数,若 n == 2/3/4/5/6,则不是快乐数(即一个数在循环的过程中,若循环到非快乐数,则这个数不可能为快乐数)。
n = sum;}return n ==1;}