如何不使用math.sqrt判断完全平方数?Java代码问题求助
问题分析与修改方案
你的代码核心问题在于for循环是空的,且循环逻辑完全错误:
- 循环
for(a = 1;a<num;a++){ }只会让a从1一直递增到num,循环结束后a的值等于num,这时候判断a*a == num只有当num=1时成立,其他情况全错。 - 另外没有处理负数、0这类边界情况,也没有在找到平方根时提前终止循环,效率极低。
具体修改步骤:
- 添加循环内的判断逻辑:在for循环内部检查
a*a是否等于目标数,找到后直接输出结果并结束程序。 - 优化循环上限:循环不需要遍历到
num,只需要到Math.sqrt(num)即可,因为如果a的平方已经大于num,后续的数平方只会更大,没必要继续循环。 - 处理边界情况:先判断输入的
num是否为负数,负数不可能是完全平方数;num=0是完全平方数(0=0²)。 - 移除无效的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
相关产品推荐
相关产品推荐

