用 java 编写一个算法来判断一个数 n 是不是快乐数

1、定义

  • 对于一个 正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程指导这个数变为 1,也可以能是 无限循环 但始终变不到 1。
  • 如果 可以变为 1,那么这个数就是快乐数。

2、示例

输入整数:19
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
输出结果:true

3、实现

/**
 * <h1>编写一个算法来判断一个数 n 是不是快乐数</h1>
 * Created by woniu
 */
public class Test {

    /**
     * <h2>测试用例</h2>
     * */
    public static void main(String[] args) {
        isHappyNumber(19);
    }

    /**
     * <h2>判断一个数是不是快乐数</h2>
     * @param number 整数
     * */
    public static boolean isHappyNumber(Integer number){
        System.out.println("输入整数:" + number);

        // 快乐数是一个正整数,所以小于 0 的一定不是
        if(number < 0){
            System.out.println("输出结果:false");
            return false;
        }

        // 正整数等于 1 的一定是快乐数
        if(number == 1){
            System.out.println("输出结果:true");
            return true;
        }

        // 临时存放已经计算过的整数
        Set<Integer> existNumber = new HashSet<>();
        while (number != 1){
            // 校验整数是否存在,存在即无限循环,证明该整数不是快乐数
            if(existNumber.contains(number)){
                System.out.println("整数重复:" + number);
                System.out.println("输出结果:false");
                return false;
            }

            // 把整数添加到 Set 集合,用于校验整数是否存在
            existNumber.add(number);

            // 解析整数,开始计算
            String numberStr = number + "";
            char[] strCharArray = numberStr.toCharArray();
            int sum = 0;
            // 快乐数计算过程日志
            String log = "";
            for(int i = 0; i< strCharArray.length; i++){
                Integer n = Integer.parseInt(strCharArray[i] + "");

                log += " + " + n + "^2";

                sum += n * n;
            }
            log += " = " + sum;
            // 打印计算过程
            System.out.println(log.substring(3,log.length()));
            number = sum;
        }
        System.out.println("输出结果:true");
        return true;
    }
}

4、测试

4.1、示例一

输入整数:18
1^2 + 8^2 = 65
6^2 + 5^2 = 61
6^2 + 1^2 = 37
3^2 + 7^2 = 58
5^2 + 8^2 = 89
8^2 + 9^2 = 145
1^2 + 4^2 + 5^2 = 42
4^2 + 2^2 = 20
2^2 + 0^2 = 4
4^2 = 16
1^2 + 6^2 = 37
整数重复:37
输出结果:false

4.2、示例二

输入整数:1818
1^2 + 8^2 + 1^2 + 8^2 = 130
1^2 + 3^2 + 0^2 = 10
1^2 + 0^2 = 1
输出结果:true

实践是检验真理的唯一标准,一键送三连关注不迷路。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值