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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:50:34