问题描述:
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19
输出: true
解释: 11+99=82
88 + 22 = 68
66 + 88 = 100
11 + 00 + 0*0 = 1
思路分析:
可以将数字直接转换为字符串,然后对其各个字符的二次方求和,如果和为1,则直接输出true(递归出口)。那如果不是呢,就会陷入死循环中,那么我们利用set集合来解决这个问题,出现一次和,我们就先判断是否包含在了set中,如果包含在set中,则直接输出false,反之加入到解和set中去。
代码见下:
import java.util.*;
public class Kls {
//快乐数
Set<Integer> set=new HashSet<>();//建立set集合
public boolean isHappy(int n) {
if (n==1)//递归出口
return true;
String a=String.valueOf(n);//转为字符串
int tempres=0;//计算平方和
for (int i=0;i<=a.length()-1;i++)
{
tempres+=Math.pow(a.charAt(i)-'0',2);
}
if (set.contains(tempres))//判断是否包含在set中
return false;
set.add(tempres);
return isHappy(tempres);//递归解决
}
public static void main(String[] args) {
Scanner a=new Scanner(System.in);//输入数据
if (new Kls().isHappy(a.nextInt()))
System.out.println("yes");
else
System.out.println("no");
}
}
运行结果如下: