You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用math.sqrt判断完全平方数?Java代码问题求助

问题分析与修改方案

你的代码核心问题在于for循环是空的,且循环逻辑完全错误:

  • 循环for(a = 1;a<num;a++){ }只会让a从1一直递增到num,循环结束后a的值等于num,这时候判断a*a == num只有当num=1时成立,其他情况全错。
  • 另外没有处理负数、0这类边界情况,也没有在找到平方根时提前终止循环,效率极低。

具体修改步骤:

  1. 添加循环内的判断逻辑:在for循环内部检查a*a是否等于目标数,找到后直接输出结果并结束程序。
  2. 优化循环上限:循环不需要遍历到num,只需要到Math.sqrt(num)即可,因为如果a的平方已经大于num,后续的数平方只会更大,没必要继续循环。
  3. 处理边界情况:先判断输入的num是否为负数,负数不可能是完全平方数;num=0是完全平方数(0=0²)。
  4. 移除无效的break:原来的break不在循环内,没有作用,直接删掉。

修改后的完整代码:

import java.util.Scanner;
class Q3{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int num = 0;
        int a = 0;
        System.out.println("Type a number to check if it is a perfect square");
        num = sc.nextInt();

        // 处理负数情况
        if (num < 0) {
            System.out.println("Not ok");
            return;
        }
        // 处理0的情况
        if (num == 0) {
            System.out.println("Ok");
            return;
        }

        // 循环到平方根即可,减少不必要的遍历
        for(a = 1; a <= Math.sqrt(num); a++){
            if (a*a == num){
                System.out.println("Ok");
                return; // 找到后直接结束程序
            }
        }
        // 循环结束都没找到,说明不是完全平方数
        System.out.println("Not ok");
   }
}

额外优化(可选):

如果不想用Math.sqrt,可以用a*a <= num作为循环条件,避免浮点数运算:

// 替换原来的for循环
for(a = 1; a*a <= num; a++){
    if (a*a == num){
        System.out.println("Ok");
        return;
    }
}
System.out.println("Not ok");

内容的提问来源于stack exchange,提问作者user20353484

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:35:26