【问题标题】:not existing while loop (java code)不存在的while循环(java代码)
【发布时间】:2013-09-25 08:16:04
【问题描述】:
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 循环根本不起作用。谁能告诉我原因?非常感谢。

【问题讨论】:

  • j 将如何大于/等于 i ?
  • 仅作记录。根本不应该有一个while循环。只有在不确定循环是否会被执行时才使用 while 循环。在您的情况下,您肯定会进入循环。在这种情况下,请使用 do-while。
  • 非常感谢大家。但我可能需要改写我的问题。(对不起,我的英语不是我的母语。)我需要那个 while 循环来跟踪我列出的素数。算法是我一个一个地检查每个整数。只有当检查的数字是原始的时,计数器的值才会增加。不幸的是,代码不是这样工作的。再次,非常感谢
  • @user2814227 为什么不趁机尝试一下解决方案呢?他们就是这样做的。

标签: java while-loop


【解决方案1】:

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

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

for (i = 2; counter <= 50; i++){

【讨论】:

    【解决方案2】:

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

    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 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229

    【讨论】:

    • 非常感谢。它有效,这就是我想要的。您能否向我解释一下最大的问题是什么以及while循环不起作用的原因。顺便说一句,我也是中国人。(从你的姓氏来看。)
    • 第一个问题是只有当“for (i = 2; i
    【解决方案3】:

    你为什么不写一个布尔 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
      }
    }
    

    【讨论】:

    • 是的,这是一种优雅的做法。但我只想让事情轻松完成。无论如何,非常感谢。
    • 优雅的方式通常是做事轻松的方式。
    • 同意,稍后再试
    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 2010-11-26
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多