1-500素数打印及素数索引查找代码逻辑错误求助
Java素数索引查找程序的逻辑修正
问题描述
编写了如下Java程序用于打印1-500之间的素数,并查找输入素数的索引,但运行时if条件判断出现问题:例如输入素数3(其在列表中的索引为2),程序却输出“3 is not found”。
原代码
public static void main(String[] args) { List<Integer> Prime_Numbers = new ArrayList<Integer>() ; for (int x = 1; x <= 500; x ++) { int count = 0; for (int y = 2 ; y <= x / 2 ; y ++){ if (x % y == 0){ count++; break; } } if(count == 0) ((ArrayList) Prime_Numbers).add(x); } System.out.println(Prime_Numbers); System.out.println("Enter a prime number from the list"); Scanner sc = new Scanner(System.in); int key = sc.nextInt(); int index = Arrays.binarySearch((Prime_Numbers.toArray()) , key); if(index == key) //when index = key its printing %d is not found System.out.printf("%d is found at "+index,key); else System.out.printf("%d is not found",key); }
核心问题分析
Arrays.binarySearch返回值理解错误:该方法找到元素时返回的是元素在数组中的索引位置,找不到时返回-(插入点) - 1。你错误地将返回的索引和输入的素数key做比较,比如输入3时,索引是2,2≠3,所以进入else分支输出“未找到”。- 素数定义错误:1不是素数,但原代码将1加入了素数列表,不符合素数的定义(素数是大于1的自然数,仅能被1和自身整除)。
- 不必要的强制类型转换:
((ArrayList) Prime_Numbers).add(x);中,Prime_Numbers本身就是ArrayList实例,无需强制转换,直接调用add方法即可。
修正后的代码
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class PrimeFinder { public static void main(String[] args) { List<Integer> primeNumbers = new ArrayList<>(); // 修正素数判断:从2开始遍历,排除1 for (int x = 2; x <= 500; x++) { boolean isPrime = true; // 优化素数判断效率:遍历到sqrt(x)即可,无需到x/2 for (int y = 2; y <= Math.sqrt(x); y++) { if (x % y == 0) { isPrime = false; break; } } if (isPrime) { primeNumbers.add(x); } } System.out.println("1-500之间的素数列表:" + primeNumbers); System.out.println("请输入列表中的一个素数:"); Scanner sc = new Scanner(System.in); int key = sc.nextInt(); int index = Arrays.binarySearch(primeNumbers.toArray(), key); // 正确判断逻辑:index >=0 表示元素存在 if (index >= 0) { System.out.printf("%d 已找到,索引位置为:%d%n", key, index); } else { System.out.printf("%d 不在素数列表中%n", key); } sc.close(); } }
关键修正点说明
- 修正判断条件:将
if(index == key)改为if(index >= 0),因为Arrays.binarySearch返回值非负时表示元素存在,对应索引位置。 - 修复素数范围:素数从2开始遍历,排除不符合定义的1。
- 优化素数判断效率:内层循环只需遍历到
Math.sqrt(x),减少不必要的循环次数。 - 代码规范优化:变量名改为小驼峰命名(符合Java编码规范),添加注释说明,关闭Scanner资源避免泄漏。
内容的提问来源于stack exchange,提问作者M S
相关产品推荐
相关产品推荐

