它现在可以找到输入范围内的所有质数,但找不到最小质数2。
for(int number=2;number<range;number++){
for(int testDivide=2;testDivide<Math.sqrt(number);testDivide++){
if(number%testDivide!=0) {
System.out.println(number);
}
break;
}对于范围10,它打印:5 7 9,但没有2。
发布于 2013-10-09 10:40:28
你的代码没有产生正确的结果(缺少2和3;包括9)的原因是你的主性测试逻辑是向后的。如果内部循环完成时没有找到任何偶除数,则该数是质数;相反,如果找到任何非除数,则打印该数。
试着这样做:
for( int number = 2; number < range; number++) {
boolean divisible = false;
int limit = (int) Math.sqrt(number);
for (int testDivide = 2; !divisible && testDivide <= limit; testDivide++) {
divisible = number % testDivide == 0;
}
if (!divisible) {
System.out.println(number);
}
}请注意,生成一个范围内的所有素数的一种更有效的方法是Sieve of Eratosthenes。
发布于 2013-10-09 10:14:30
检查这里的代码: package core;
public class Test2 {
public static void main(String[] args) {
int cnt = 0;
for (int i = 2;; i++) {
if (Priem(i)) {
cnt++;
System.out.println(i);
if (cnt == 200)
break;
}
}
}
public static boolean Priem(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}发布于 2013-10-09 10:19:30
我认为您的for循环有点混乱。
for(int testDivide=2;testDivide<Math.sqrt(number);testDivide++){
}不确定为什么在testDivide等于sqrt(数字)时停止,应该在testDivide大于时停止。
在你的内部for循环中也是不正确的:
if(number%testDivide!=0) {
System.out.println(number);
}
break;基本上,这将做的是检查数字是否可被2整除,然后中断。你只需要在你找到一个整整齐齐的数字(number%testDivide==0)时中断即可。可以保留一个布尔值,在中断时将其设置为true,如果该布尔值为false,则仅在内部for循环结束后打印。
大致是这样的:
for (int number=2; number<range; number++){
boolean found = false;
int limit = (int)Math.sqrt(number);
for (int testDivide=2; testDivide<=limit; testDivide++){
if(number%testDivide==0) {
found = true;
break;
}
}
if (!found) System.out.println(number);
}https://stackoverflow.com/questions/19261758
复制相似问题