一个完全平方数(Perfect Square)是指可以表示为某个整数的平方的数。例如,4 是一个完全平方数,因为 2 2 = 4;9 也是一个完全平方数,因为 3 3 = 9。非负整数的完全平方数包括 0, 1, 4, 9, 16, 25 等。
在 Java 中,判断一个数是否为完全平方数最直观的方法是使用 Math.sqrt() 函数。例如,int root = (int) Math.sqrt(num); return root * root == num;。然而,在某些特定场景下,我们可能需要避免使用 Math.sqrt():
因此,我们需要寻找一种纯整数运算的迭代方法来解决这个问题。
判断一个整数 num 是否为完全平方数,我们可以从 1 开始,逐个检查整数 i 的平方 i * i 是否等于 num。如果找到一个 i 使得 i * i == num,则 num 是完全平方数。如果 i * i 已经大于 num,那么后续的 i 的平方肯定也会大于 num,此时就可以停止搜索,并判断 num 不是完全平方数。
算法步骤:
* i == num,则 num 是完全平方数,返回 true。以下是一个完整的 Java 程序,演示了如何实现上述逻辑:
import java.util.Scanner;
public class PerfectSquareChecker {
/**
* 判断一个整数是否为完全平方数,不使用 Math.sqrt() 方法。
*
* @param num 待检查的整数
* @return 如果是完全平方数则返回 true,否则返回 false
*/
public static boolean isPerfectSquare(int num) {
// 1. 处理特殊情况
if (num < 0) {
return false; // 负数不是完全平方数
}
if (num == 0 || num == 1) {
return true; // 0和1是完全平方数
}
// 2. 迭代搜索
// 使用 long 类型来存储 i*i,以防止对于较大的 int 类型数,i*i 发生溢出
for (long i = 1; i * i <= num; i++) {
if (i * i == num) {
return true; // 找到一个整数 i,其平方等于 num
}
}
// 3. 循环结束,未找到
return false; // 未找到满足条件的 i,num 不是完全平方数
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数,我们将检查它是否为完全平方数:");
int numberToCheck = scanner.nextInt();
if (isPerfectSquare(numberToCheck)) {
System.out.println(numberToCheck + " 是一个完全平方数。");
} else {
System.out.println(numberToCheck + " 不是一个完全平方数。");
}
scanner.close();
}
}isPerfectSquare 方法:
关于 (number % i == 0) && (number / i == i) 的讨论: 在某些解决方案中,可能会看到 (number % i == 0) && (number / i == i) 这样的判断。这个条件是用来检查 i 是否既是 number 的因子,同时 number 除以 i 的商也等于 i。这确实等价于 i * i == number。然而,在迭代寻找平方根的场景下,直接使用 i * i == number 更为直观和高效,因为它避免了额外的除法和取模运算。i * i
输入处理: main 方法使用 Scanner 从用户获取输入,并调用 isPerfectSquare 方法进行判断,然后输出结果。
通过本文,我们学习了如何在不依赖 Math.sqrt() 的情况下,使用迭代方法判断一个整数是否为完全平方数。核心在于构建一个从 1 开始,以 i * i