1.题目要求
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
2.代码(C语言版)
int getSum(int n){
int sum=0;
while(n){
sum+=(n%10)*(n%10);//个位数相乘
n/=10;//n除以10
}
return sum;
}
bool isHappy(int n) {
int sum=getSum(n);
int hash[802]={0};
while(sum!=1){
if(hash[sum]==1){//计算值sum反复出现
//使用数组作为哈希表用来存放每次计算的结果,初始数组都为 0,每次计算后将结果作为下标映射到数组元素。若对应数组元素为 0,说明此结果没得到过,将其改为 1;若为 1,说明计算结果已经重复,return false。
return false;
}else{
hash[sum]++;
}
sum=getSum(sum);
}
return true;
}
那么数组的大小怎么确定呢?题目中告诉了 n 的大小最大不超过 2^31-1,即最大不超过 10 位数,也就是说,计算的结果最大不超过 9^2*10 也就是 810,再稍微大一点就行了,所以是820,这也是为什么本题能用数组的原因
作者:TaiSui
链接:https://leetcode.cn/problems/happy-number/solutions/2086749/202-kuai-le-shu-ha-xi-biao-by-taisui-5wnf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。