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
相关产品推荐
相关产品推荐

