如何编写Java程序判断完全平方数,非完全平方数则输出因数?
解决方案
首先调整代码以处理整数输入(因数仅针对正整数有意义),并新增因数收集方法,以下是完整修改后的代码:
import java.util.Scanner; import javax.swing.JOptionPane; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Labor1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter a number: "); // 改为int类型输入,避免double精度问题 int number = sc.nextInt(); if (checkPerfectSquare(number)) JOptionPane.showMessageDialog(null,"PERFECT","ANSWER",JOptionPane.QUESTION_MESSAGE); else { // 获取所有因数并格式化显示 List<Integer> factors = getAllFactors(number); String result = "NOT PERFECT\nFactors: " + factors.toString().replace("[", "").replace("]", ""); JOptionPane.showMessageDialog(null, result, "ANSWER", JOptionPane.QUESTION_MESSAGE); } } static boolean checkPerfectSquare(int number) { if (number < 1) return false; // 非正整数不可能是完全平方数 for(int i = 1; i * i <= number; i++) { if((number % i == 0) && (number / i == i)) { return true; } } return false; } // 收集并返回所有正因数的方法 static List<Integer> getAllFactors(int number) { List<Integer> factors = new ArrayList<>(); if (number < 1) { factors.add(0); // 非正整数返回空或提示,这里简单处理 return factors; } // 遍历到平方根,减少循环次数 for (int i = 1; i <= Math.sqrt(number); i++) { if (number % i == 0) { factors.add(i); // 避免重复添加完全平方数的平方根(此处已排除完全平方数,仍保留判断增强鲁棒性) if (i != number / i) { factors.add(number / i); } } } Collections.sort(factors); // 对因数排序,输出更直观 return factors; } }
关键修改说明:
- 输入类型调整:将
double改为int,因为因数是针对整数的,且double处理大整数会有精度丢失问题。 - 新增因数收集方法:
getAllFactors通过遍历到输入数的平方根来高效收集因数,每找到一个因数i,同时添加对应的配对因数number/i,避免重复遍历整个数字范围。 - 因数排序:使用
Collections.sort对因数列表排序,让输出的因数按从小到大排列,更易读。 - 边界处理:添加了非正整数的判断,避免无意义的因数计算。
- 结果格式化:在非完全平方数分支中,将因数列表格式化为字符串,与"NOT PERFECT"一起显示在弹窗中。
内容的提问来源于stack exchange,提问作者Josh Andrew
相关产品推荐
相关产品推荐

