如何在 Java 中检查一个数是否为完全平方数

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何在 Java 中判断一个给定的整数是否为完全平方数。我们将探讨如何使用 Math.sqrt() 方法来计算一个数的平方根,然后检查结果是否为整数。

通过实际的编码练习,你将实现一个 Java 程序,该程序会获取用户输入,计算平方根,并判断原始数字是否为完全平方数。我们还将使用各种输入(包括负数和非完全平方数)对程序进行测试,以确保其健壮性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/math("Math") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("User Input") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") subgraph Lab Skills java/if_else -.-> lab-559958{{"如何在 Java 中检查一个数是否为完全平方数"}} java/math -.-> lab-559958{{"如何在 Java 中检查一个数是否为完全平方数"}} java/user_input -.-> lab-559958{{"如何在 Java 中检查一个数是否为完全平方数"}} java/exceptions -.-> lab-559958{{"如何在 Java 中检查一个数是否为完全平方数"}} java/math_methods -.-> lab-559958{{"如何在 Java 中检查一个数是否为完全平方数"}} end

计算平方根并检查是否为整数

在这一步中,我们将编写一个 Java 程序来计算一个数的平方根,并判断原始数字是否为完全平方数。完全平方数是一个整数,它是某个整数的平方;换句话说,它是一个整数与自身相乘的结果。例如,9 是一个完全平方数,因为它等于 3 * 3。

我们将使用 Java 提供的 Math.sqrt() 方法来计算平方根。该方法返回一个 double 类型的值,可能包含小数部分。为了判断原始数字是否为完全平方数,我们需要检查其平方根是否为整数。

  1. 首先,在你的 ~/project 目录下创建一个名为 SquareRootChecker.java 的新 Java 文件。你可以通过在左侧的文件资源管理器中右键单击,选择“新建文件”,然后输入 SquareRootChecker.java 来完成此操作。

  2. 在编辑器中打开 SquareRootChecker.java 文件,并粘贴以下代码:

    import java.util.Scanner;
    
    public class SquareRootChecker {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter an integer: ");
            int number = scanner.nextInt();
    
            if (number < 0) {
                System.out.println("Cannot calculate the square root of a negative number.");
            } else {
                double squareRoot = Math.sqrt(number);
    
                // 检查平方根是否为整数
                if (squareRoot == Math.floor(squareRoot)) {
                    System.out.println(number + " is a perfect square.");
                } else {
                    System.out.println(number + " is not a perfect square.");
                }
            }
    
            scanner.close();
        }
    }

    让我们来看看这段代码的新部分:

    • import java.util.Scanner;:我们再次导入 Scanner 类以读取用户输入。
    • System.out.print("Enter an integer: ");:这会提示用户输入一个数字。
    • int number = scanner.nextInt();:这会读取用户输入的整数,并将其存储在 number 变量中。
    • if (number < 0):这是一个 if 语句,用于检查输入的数字是否为负数。如果是负数,我们将打印一条错误消息。
    • double squareRoot = Math.sqrt(number);:这行代码使用 Math.sqrt() 方法计算 number 的平方根,并将结果存储在一个名为 squareRootdouble 类型变量中。
    • if (squareRoot == Math.floor(squareRoot)):这是检查平方根是否为整数的核心逻辑。Math.floor(squareRoot) 返回小于或等于 squareRoot 的最大整数。如果 squareRoot 是整数,那么 squareRootMath.floor(squareRoot) 将相等。
    • System.out.println(...):这些行根据数字是否为完全平方数来打印结果。
  3. 保存文件(Ctrl + S 或 Cmd + S)。

  4. 现在,在终端中编译程序:

    javac SquareRootChecker.java

    如果没有错误,将创建一个 SquareRootChecker.class 文件。

  5. 运行编译后的程序:

    java SquareRootChecker
  6. 程序会提示你输入一个整数。输入一个数字,如 9,然后按回车键。你应该会看到输出表明 9 是一个完全平方数。再次运行程序,输入一个数字,如 10。你应该会看到输出表明 10 不是一个完全平方数。

    Enter an integer: 9
    9 is a perfect square.
    Enter an integer: 10
    10 is not a perfect square.

你已经成功编写了一个 Java 程序,它可以计算平方根并判断一个数字是否为完全平方数!

使用 Math.sqrt() 检查完全平方数

在这一步中,我们将重点了解 Math.sqrt() 方法的工作原理,以及在上一步中我们是如何使用它来判断一个数是否为完全平方数的。

Math.sqrt() 方法是 Java 内置 Math 类的一部分,该类提供了许多数学函数。Math.sqrt(double a) 接受一个 double 类型的值 a 作为输入,并返回其平方根,返回值类型也是 double

例如:

  • Math.sqrt(9.0) 返回 3.0
  • Math.sqrt(10.0) 约返回 3.1622776601683795
  • Math.sqrt(0.0) 返回 0.0
  • Math.sqrt(-9.0) 返回 NaN(非数字)

在我们的 SquareRootChecker.java 程序中,我们从用户那里读取一个整数,但 Math.sqrt() 方法期望的是一个 double 类型的参数。当我们将 int 类型的 number 传递给 Math.sqrt() 时,Java 会自动将其转换为 double 类型。

检查一个数是否为完全平方数的关键在于将计算得到的平方根(double squareRoot)与其向下取整的值(Math.floor(squareRoot))进行比较。

  • 如果 squareRoot 是一个整数(如 3.0),那么 Math.floor(squareRoot) 也将是 3.0,此时条件 squareRoot == Math.floor(squareRoot) 为真。
  • 如果 squareRoot 有小数部分(如 3.16...),那么 Math.floor(squareRoot) 将是 3.0,此时条件 squareRoot == Math.floor(squareRoot) 为假。

通过这种简单的比较,我们可以有效地判断原始整数是否为完全平方数。

让我们多次重新运行程序,观察不同输入的输出结果,以加深你的理解。

  1. 确保你在终端中处于 ~/project 目录下。

  2. 再次运行编译后的程序:

    java SquareRootChecker
  3. 输入数字 25 并按回车键。观察输出结果。

    Enter an integer: 25
    25 is a perfect square.
  4. 再次运行程序:

    java SquareRootChecker
  5. 输入数字 15 并按回车键。观察输出结果。

    Enter an integer: 15
    15 is not a perfect square.

通过使用不同的输入运行程序,你可以看到 Math.sqrt()Math.floor() 的比较是如何正确识别完全平方数的。

测试负数和非整数输入

在这一步中,我们将使用负数来测试我们的 SquareRootChecker.java 程序,并考虑如果用户输入非整数会发生什么情况。

在我们编写的代码中,包含了对负数的检查:

if (number < 0) {
    System.out.println("Cannot calculate the square root of a negative number.");
}

这个 if 语句处理了用户输入负整数的情况。让我们来测试代码的这部分。

  1. 确保你在终端中处于 ~/project 目录下。

  2. 运行编译后的程序:

    java SquareRootChecker
  3. 当程序提示时,输入一个负数,例如 -4,然后按回车键。

    Enter an integer: -4
    Cannot calculate the square root of a negative number.

    正如预期的那样,程序正确识别出无法计算负数的平方根,并打印出相应的消息。

现在,让我们考虑如果用户输入非整数(如文本或小数)会发生什么。我们的程序使用 scanner.nextInt() 来读取输入。这个方法设计为只读取整数值。如果用户输入的内容无法解析为整数,将会抛出 InputMismatchException 异常,程序会崩溃。

优雅地处理此类错误是编写健壮程序的重要部分。在这个入门实验中,我们不会为非整数输入实现完整的错误处理,但要意识到这种情况可能会发生。在未来的实验中,你将学习像 try-catch 块这样的技术来处理异常,使你的程序对意外的用户输入更具弹性。

现在,让我们观察一下输入非整数时会发生什么。

  1. 再次运行编译后的程序:

    java SquareRootChecker
  2. 当程序提示时,输入一些文本,例如 hello,然后按回车键。

    Enter an integer: hello
    Exception in thread "main" java.util.InputMismatchException
        at java.base/java.util.Scanner.throwFor(Scanner.java:939)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at SquareRootChecker.main(SquareRootChecker.java:9)

    你会看到一条错误消息,表明发生了 InputMismatchException。这是因为 scanner.nextInt() 期望输入一个整数,但接收到的是 "hello"。

这一步强调了考虑不同类型的用户输入以及程序如何处理这些输入的重要性。虽然我们当前的程序很简单,但理解这些潜在问题对于开发更复杂的应用程序至关重要。

总结

在这个实验中,我们学习了如何在 Java 中判断一个给定的整数是否为完全平方数。我们使用了 Math.sqrt() 方法来计算输入数字的平方根。

核心逻辑是通过使用 Math.floor() 方法将计算得到的平方根与其向下取整的值进行比较,以此来检查该平方根是否为整数。我们还处理了输入为负数的情况,因为负数的平方根不是实数。通过这个过程,我们能够有效地识别完全平方数。