簡體   English   中英

基本 Java - 使用 while 循環查找數字是否為質數

[英]Basic Java - Finding if a number is a prime number using while loop

我有一個關於不久前在這里給出的答案的問題。
我自己在附加的代碼中提出了相同的答案,但我試圖理解為什么我需要將輸入數字除以 2(第 10 行),而不僅僅是讓循環運行直到輸入的值達到的數量。

 1  import java.util.Scanner;            
 2  public class numIsPrime {
 3      public static void main(String[] args) {
 4          Scanner sc = new Scanner(System.in);
 5          int i = 2; 
 6          boolean isPrime = true;
 7          System.out.println("Enter a number");
 8          int num = sc.nextInt();
 9        
10          while (i < num )   // (i <= num / 2)  
11          {
12              if (num % i == 0) 
13                  isPrime = false; 
14              i++;
15          }
16       
17          if (isPrime)
18              System.out.println(num + " is a prime number");
19          else // !isPrime
20              System.out.println(num + " isn't a prime number");
21
22      }
23  }

正如評論中提到的,除以 2 是減少檢查次數的最簡單優化,但是,現有代碼存在一些問題(例如,對於不是素數的 0 和 1 返回true )並且可以進一步優化:

  • 一旦isPrime設置為false ,就中斷/結束循環
  • 通過增加 2 跳過偶數
  • 計算直到i * i <= num
    如果達到此限制,則意味着在[2, num/i]范圍內沒有找到num的因子i ,因此根據素數的定義,范圍[num/i, num]中的所有剩余數字都不是num的因數,因此num是素數。
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number");
int num = sc.nextInt();

boolean isPrime = num % 2 != 0 || num == 2;
int i = 3;

while (isPrime && i * i <= num) {
    if (num % i == 0) 
        isPrime = false; 
    i += 2; // skip even numbers
}
if (isPrime)
    System.out.println(num + " is a prime number");
else 
    System.out.println(num + " isn't a prime number");

如果排除 3 的整除數(除了 3)類似於排除偶數,則可能進行更多優化,然后從 5 繼續搜索並且素數的候選符合6n ± 1規則(例如,5 = 6 - 1, 7 = 6 + 1、11 = 12 - 1、13 = 12 + 1 等):

boolean isPrime = (num % 2 != 0 || num == 2) && (num % 3 != 0 || num == 3);
int i = 5;
int d = 2;

while (isPrime && i * i <= num) {
    if (num % i == 0) 
        isPrime = false; 
    i += d;    // check only non-even numbers
    d = 6 - d; // switch 2 to 4 and back to 2
}

這是計算 integer n是否可能是素數的最簡單方法:

public static boolean isPrime (int n) {
    if (n < 2) return false;
    BigInteger bigInt = BigInteger.valueOf(n);
    return bigInt.isProbablePrime(100);
}

您可以在循環中插入此 function 調用,您可以在每次迭代中傳遞一個新數字。 我使用 Java 提供的BigInteger的實現來進行計算,而不是自己編寫。 除非這是一項家庭作業並且您需要編寫自己的算法,否則我會使用此解決方案。

然后,此基本方法可用於計算其他類型的素數。 完整的答案可以在這里找到。

更新

BigInteger.isProbablePrime(int)中的int參數是調用者願意容忍的不確定性的度量。 數字越大,它執行的“越慢”(但越確定)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM