前言
数论问题
肥仔快乐水(可乐)
肥仔快乐花(鸡米花)
肥仔快乐饼(pizza)
肥仔快乐鸡(炸鸡)
肥仔快乐茶(奶茶)
肥仔快乐辣(辣条)
肥仔快乐瘦(喵喵)
肥仔快乐事(乐事)
肥仔快乐网(bilibili)
肥仔快乐家族有多了新成员、肥仔快乐数
正文
问题来源
本问题来自leetcode上的202题。这道题并不难
问题描述
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例 1:
输入: 19
输出: true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
分析:
一个数不是快乐数,一定会进入一个循环。但是并不是输入的数和无限循环的数相同。
例如:56
56:55+66=61
61:66+11=37
37 → 58 → 89 → 145 → 42 → 20 → 4 → 16 → 37
C代码如下:
int isHappy(int n) {
int m=n;
int temp=n;
int a;
int idx=0;
int i;
int b[1000];//最好用vector
while(m!=1)
{
temp = 0;
while(m)
{
a = m%10;
temp += a*a;
m = m/10;
}
m = temp;
for(i=0;i<idx;i++)
{
if(m==b[i]) return 0;
}
b[idx++] = m;
}
return 1;
}
百度百科上,不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。
可以根据这个性质,优化代码。
总结:
数论的性质很重要。
结语
闲来无事的话,多练习练习,做做题。