【问题标题】:Print primes starting from 2 to the entered number and avoid the "n/2" logic [duplicate]从 2 开始打印素数到输入的数字,并避免“n/2”逻辑 [重复]
【发布时间】:2018-08-29 17:58:50
【问题描述】:

我有点困惑。我想使用 while 循环打印从 2 开始到在 java 中输入的数字的所有素数,并且不想使用 n/2 逻辑。 我不知道我的代码有什么问题。请帮帮我。

这里是代码:-

import java.util.Scanner;
public class print_primes {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
    Scanner scn = new Scanner(System.in);

    int n = scn.nextInt();
    int rem = 0;
    int i = 2;
    int flag = 0;
    int start = 3;
    System.out.println("2");
    while (start <= n) {
      i = 2;
      while (i <= start - 1) {
        rem = start % i;
        if (rem == 0) {
          flag = 1;
        }
        i = i + 1;
     }
     if (flag == 0) {
       System.out.println(start);
     }
     start++;
   }
 }
}

【问题讨论】:

  • 代替 n/2,您可以将迭代减少到 n 的平方根!在网上搜索差不多。此外,还有Sieve of Eratosthenes...
  • 你能告诉我在我的代码中需要改变什么,以便它能够工作吗?因为我对你提到的事情了解不多。那么请告诉我如何让它以我的风格工作?
  • 请先说明问题所在。预期的结果和实际得到的结果
  • 您也使用int 作为标志。 boolean 可能更适合这个
  • 运行代码时会发生什么?你有任何错误吗?如果是这样,它们是什么?如果不是,输出是什么?它与您想要的有什么不同?我建议您阅读ericlippert.com/2014/03/05/how-to-debug-small-programs,了解有关如何调试代码的一些提示。

标签: java primes


【解决方案1】:

更简单的方法:

public class Test {

   // method to check if each number is prime
   public static boolean isPrime(int x) {
      for (int i = 2; i < x; i++)
         if (x % i == 0) {
            return false;
         }
      return true;
   }

   public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);

      System.out.println("Enter a number");
      int num = scanner.nextInt();

      // print out 2 as we wont be checking even numbers.
      System.out.println(2);

      // iterate till user input
      for (int i = 3; i < num; i = i + 2) {
        if (isPrime(i)) {
          System.out.println(i);
        }
      }
   }
}

【讨论】:

  • for (int i = 2; i &lt; num; i++) 应该是 for (int i = 3; i &lt; num; i=i+2) 为什么你也要检查偶数?
  • 感谢您指出这一点,并进行了相应的更改。
  • 投反对票:为什么投反对票?
  • 投反对票的人,为什么投反对票?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2012-11-02
相关资源
最近更新 更多