首页 > 解决方案 > 在给定(输入)范围内给出快乐数字的数量

问题描述

作为一个练习,我需要编写一个代码,在给定范围内给出快乐数字*的数量。作为一项测试,我需要将代码插入一个检查 10 种不同结果的程序中,对于每个好的结果,您将获得 4 分。我想要完整的 40 分,我的老师说我只需要在我的代码中更改一点点。到目前为止,我有这个:

*一个快乐的数字是一个数字,当替换为每个数字的平方和时最终达到1。例如,13 是一个快乐的数字,因为 1^2 + 3^2 = 10 和 1^2 + 0^2 = 1

重要的是要知道:当你最终得到一个 4 时,这绝对不是一个快乐的数字。

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String st1 = scan.nextLine().trim();
        String st2 = scan.nextLine().trim();

        int min = Integer.parseInt(st1);
        int max = Integer.parseInt(st2);

        Set<Integer> happyNumbers = getHappyNumbers(min, max);
        System.out.println(happyNumbers.size());

    }

    public static Set<Integer> getHappyNumbers(int min, int max) {
        Set<Integer> out = new HashSet<>();
        for (int i = min; i < max; i++) {
            if (isHappy(i)) {
                out.add(i);
            }
        }
        return out;
    }

    private static boolean isHappy(int i) {
        int sum = 0;
        while (i != 0) {
            sum += Math.pow((i % 10), 2);
            i /= 10;
        }
        if (sum == 4) return false;
        else if(sum == 1) return true;
        else if (sum !=1) {return isHappy(sum);}
        else return true;
    }
}

我的老师还说错误在以下部分:

if (sum == 4) return false;
        else if(sum == 1) return true;
        else if (sum !=1) {return isHappy(sum);}
        else return true;

请帮忙 :)

标签: java

解决方案


import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class HappyNumbersMain {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("Lower limit (>0): ");
        String st1 = scan.nextLine().trim();
        System.out.print("Upper limit: ");
        String st2 = scan.nextLine().trim();

        int min = Integer.parseInt(st1);
        int max = Integer.parseInt(st2);

        Set<Integer> happyNumbers = getHappyNumbers(min, max);
        System.out.println("Happy numbers between " + min + " and " + max + ":" + happyNumbers);
    }

    public static Set<Integer> getHappyNumbers(int min, int max) {
        Set<Integer> out = new TreeSet<>();
        for (int i = min; i <= max; i++) {
            if (isHappy(i)) {
                out.add(i);
            }
        }
        return out;
    }

    private static boolean isHappy(int i) {
        // Stopping conditions
        if (i == 4) {
            return false;
        } else if (i == 1) {
            return true;
        }

        int sum = 0;
        while (i > 0) {
            sum += Math.pow((i % 10), 2);
            i /= 10;
        }

        return isHappy(sum);
    }
}

以上按预期工作,一些注意事项:

  1. 在执行递归函数时,将停止条件作为它检查的第一件事
  2. 向用户添加一些反馈有助于理解如何使用您的程序
  3. TreeSet 会对值进行排序,HashSet 不会,更好地用于显示目的
  4. 您应该始终验证用户输入(我没有这样做,但您应该这样做)

推荐阅读