leetcode202快乐数

leetcode202 Happy Numbers

Posted by BY on May 27, 2018

前言

数论问题 肥仔快乐水(可乐)
肥仔快乐花(鸡米花)
肥仔快乐饼(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 的循环中。
可以根据这个性质,优化代码。

总结:

数论的性质很重要。

结语

闲来无事的话,多练习练习,做做题。