快乐数
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19 输出: true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
用C++ unorder_set 判断有没有遇到重复值,即进入死循环。
可能因为很少有过程数超多的快乐数,所以我当时用数组也没有超时。。
//当时的废话
这题的主要问题是,怎么判断有没有进入死循环。
解决方法,把过程数保存到一个数组里,每得到一个过程数,就保存到数组里,如果数组里已经有该过程数,说明进入了死循环。
bool containNum(int n,int* hash,int* size) { int i; for(i=0;i<*size;i++) if(hash[i]==n) return true; return false; } bool judge(int n,int* hash,int *size) { if(containNum(n,hash,size)) return false; hash[(*size)++]=n; int num=0; int tmp; while(n) { tmp=n%10; num+=tmp*tmp; n/=10; } if(num==1) return true; else return judge(num,hash,size); } bool isHappy(int n) { int *hash=(int *)malloc(sizeof(int)*10000); int size=0; return judge(n,hash,&size); }