1
public class Q3
{
public static void main(String args[]){
int i, j;
int Max = 1000;
    //It's obvious that the first fifty prime numbers are less than 1000.
int counter = 1;
while (counter <= 50){
    for (i = 2; i < Max; i++){
        for (j = 2; j < i; j++){
            if ( i % j == 0){
            break;
            }
        }
        if (j >= i){
            System.out.printf("%s ", i);
            counter++;
        }
        if(counter % 10 == 0){
        System.out.print("\n");
        }       
    }
}

}
}

这是我编写的一个程序,用于列出前 50 个素数,每行 10 个。但是,由于 while 循环,它无法正常工作。执行后,这个程序列出了所有小于 1000 的素数。似乎 while 循环根本不起作用。谁能告诉我原因?非常感谢。

4

3 回答 3

1

素数由第一个for循环生成。while 主体只执行一次。

您可以删除while并在 上使用不同的条件for

for (i = 2; counter <= 50; i++){
于 2013-09-25T08:24:17.217 回答
0

你有一个大问题,真正的代码如下:

int i, j;
int Max = 1000;
//It's obvious that the first fifty prime numbers are less than 1000.
int counter = 0;
for (i = 2; i < Max && counter < 50; i++){
    for (j = 2; j < i; j++){
        if ( i % j == 0){
        break;
        }
    }
    if (j >= i){
        printf("%d ", i);
        counter++;
         if(counter % 10 == 0){
             printf("\n");
         }  
    }    
}

输出为:2 3 5 7 11 13 17 19 23 29 31 37 43 47 53 47 53 59 61 67 71 71 73 79 83 89 89 89 97 101 101 103 107 109 109 113 113 113 127 131 137 139 139 139 139 139 151 157 157 157 157 163 163 173 179 179 179 181 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 211 223 227 229

于 2013-09-25T08:32:25.687 回答
0

你为什么不写一个布尔 isPrime(int number) 函数?您必须检查它是否正确,如果是,请增加计数器并打印数字。这是一个幼稚的实现,我见过其他一些更好的实现:

boolean isPrime(int number) {
  if (number < 2 || number % 2 == 0) {
    return true;
  }
  double sqrt = Math.sqrt(number);
  for (int i = 3; i <= sqrt; i += 2) {
    if (number % i == 0) {
      return true;
    }
  }
  return false;
}

在你的里面:

for (i = 2; i < max; i++) {
  if (isPrime(i)) {
    counter++;
    // print number, print new line if needed
  }
}
于 2013-09-25T08:42:04.137 回答