【问题标题】:Java: Is there a more efficient way to do this? Checking for prime number [duplicate]Java:有没有更有效的方法来做到这一点?检查素数[重复]
【发布时间】:2020-08-02 10:25:16
【问题描述】:

有没有更好的编码方式?这是我能想到的最简单的方法,但很多人使用更复杂的代码来确定一个数字是否为质数。

public static void main(String[] args) {
    Scanner inputFromUser = new Scanner(System.in);
        int number;
        System.out.println("Please enter a number: ");
        number = inputFromUser.nextInt();
        if(number == 2 || number ==3){
            System.out.println("This number is prime");
        }
        else if(number%2 ==0 )
        {
            System.out.println("The number is not prime!");
        }
        else if(number%3 == 0){
            System.out.println("The number is not prime!");
        }
        else{
            System.out.println("This number is prime");
        }
    }
}

【问题讨论】:

  • 这是否正确? 25 呢?
  • 是的,人们通常将筛子用于 GCD 算法。而且 BigInteger 已经有了它的方法。
  • 井 25 不是素数。您需要更多代码来确定一个数字是否为素数。类似this.
  • @ElliottFrisch 我认为 25 不是质数,但被检测到是 ScaryWombat 试图提出的观点。另一方面,MGG 可能意味着按顺序尝试所有整数,所以....
  • ScaryWombat 是 尝试 制造 - 失败了

标签: java


【解决方案1】:

最简单的方法是使用:

int number = 25;
System.out.println(BigInteger.valueOf(number).isProbablePrime(Integer.MAX_VALUE));

应该打印出false。如果你想有一个非常有效的方法来寻找素数,这些方法被标明in this answer(不要忘记投票)。

自己测试所有低质数是可能的,但要注意它最终并不是那么有效。将它们全部输入代码肯定效率不高。我们尝试让计算机为我们完成工作(创建素数列表,测试下一个值,如果素数将它们添加到列表中)。

【讨论】:

  • 谢谢!抱歉,我最近才开始编码。
  • 没问题,也无需抱歉。请记住,如果您正在计数,您可能做错了什么:) 无休止的 if 语句通常清楚地表明代码没有有效地编程。
【解决方案2】:

使用Sieve of Erastosthenes 非常有效。它的工作原理如下。

  • 2 to N 创建一个数字列表
  • 找到第一个以2 开头的未标记数字(这刚刚开始,所以没有任何标记)。
  • 第一个素数是2
  • 2 开始,在从2N 的数字列表中标记每个后续2nd
  • 2 之后的第一个未标记的插槽是下一个素数(在本例中为 3)。
  • 现在从 3 开始,标记后面的每个 3rd 值。

不断重复上述操作,直到达到既定限制。每个未标记的值都是素数。

我使用BitSet 来实现这一点。这是使用 cmets 的算法。


 public List<Integer> sieve(int upperLimit) {
      BitSet hits = new BitSet();

      // return values
      List<Integer> primes = new ArrayList<>();

      for (int i = 2; i <upperLimit; i = hits.nextClearBit(i+1)) {
            // first unmarked bit starting with i
            // is a prime so record it.
            primes.add(i);

            // now starting with the next unmarked location,
            // begin marking with i+i
            for (int j = i+i; j < upperLimit; j += i) {
               hits.set(j);
            }
      }
      // once the limit has been reached, return the list
      // of primes.
      return primes;
   }

List<Integer> primes = sieve(40);
primes.forEach(System.out::print);

打印

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多