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

Java素数识别代码问题:为何数字4被判定为Prime number?

为什么你的代码会把4误判为素数?问题分析与修复

咱们直接说核心问题:你的内层循环条件写错了!

当number=4的时候,number / 2等于2,你的循环条件是i < 2,但i的初始值是2,这个条件根本不成立——也就是说,内层循环完全没执行。isPrime一直保持初始的true,所以4就被错误地当成素数输出了。

为什么这个条件错了?

判断素数的逻辑是:如果一个数n能被2到n/2之间的任何整数整除,那它就不是素数。但你的条件是i < number/2,漏掉了等于number/2的情况。对于4来说,它的因数正好是2(也就是4/2),这个关键的检查被你跳过了,自然就误判了。

顺便提个小问题:1也会被误判

你的代码里1也会被输出成素数,因为number=1时,内层循环的条件i < 0.5(1/2=0.5)同样不成立,isPrime保持true,但根据素数的定义,素数是大于1的自然数,所以1肯定不是素数,这个也要处理。

修正后的代码

不需要加特殊条件排除4,只要调整循环边界,再补上对1的判断就行:

int numbe[] = {1,2,3,4,5,6,7,8,9,10};
System.out.println("Prime Numbers are:");
for(int number : numbe) {
    boolean isPrime = true;
    
    // 先处理小于等于1的情况,直接标记为非素数
    if (number <= 1) {
        isPrime = false;
    } else {
        // 把循环条件改成i <= number/2,覆盖到等于的情况
        for (int i = 2; i <= number / 2; i++) {
            if ((number % i) == 0) {
                isPrime = false;
                break;
            }
        }
    }
    
    if (isPrime) {
        System.out.println("Prime Number: " + number);
    }
}

更高效的优化(可选)

其实判断素数不需要检查到n/2,检查到√n就够了——因为如果n有一个大于√n的因数,那对应的另一个因数肯定小于√n。这样循环次数会更少,效率更高。可以把循环条件改成下面这样(避免浮点运算的精度问题):

for (int i = 2; i * i <= number; i++) {
    if ((number % i) == 0) {
        isPrime = false;
        break;
    }
}

这样运行后,输出的素数就是正确的2、3、5、7了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:42