簡體   English   中英

查找數字是否為質數C ++

[英]Finding whether a number is prime or not c++

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

bool isPrime(int n)
{
    if (n <= 1)  return false;
    if (n <= 3)  return true;

    if (n%2 == 0 || n%3 == 0) return false;

    for (int i=5; i*i<=n; i=i+6)
        if (n%i == 0 || n%(i+2) == 0)
           return false;

    return true;
}

int main() {
    int T,n;
    cin>>T;
    while(T--){
    cin>>n;
    isPrime(n)?  cout << "Prime\n": cout << "Not prime\n";
    }
    return 0;
}

嘿,所以我正在研究這段代碼,以查找數字是否為質數,我做了很多研究,但無法找到此步驟的有效方法。

在isprime()函數中

for (int i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;

請幫助我找出任何幫助表示贊賞

好吧,這是檢查數字素數性質的經典算法之一。 因此,基本上,您正要在循環開始之前檢查2和3的可除性。

然后使用其他數字進行檢查,從5開始直到i*i = n 那是因為一個可以被任意數i整除的數n總是意味着該數i小於n平方根。 您可以通過各種示例進行驗證。 說37。i i*i>n最小數字為6 ,因此,您只需要檢查直到6 ,就可以繼續檢查,因為您已經檢查了所有其他倍數。 因此,如果您在此處找不到6以外的任何數字,則無需進一步檢查。

第二部分是,你是通過2檢查遞增的其他條件if條件。 這是因為您每次都將除數從5開始,然后將其遞增6 這樣,您可以確保只檢查可能的質數以進行除數檢驗,而不檢查其他任何素數。

我希望現在邏輯清楚。 隨時提出任何疑問。

循環

for (int i=5; i*i<=n; i=i+6)
  if (n%i == 0 || n%(i+2) == 0)
    return false;

可以寫成:

for (int i=5; i*i<=n; i=i+2)
  if (n%i == 0 )
    return false;

為了更容易理解。 您檢查數字是否可被以下項整除:

5 7 9 11 13, etc.

如果將這些奇數重新排列為:

5 7 9
11 13 15
17 19 21
23 25 27

等等。,

您會注意到,最后一列中的所有數字都是3的倍數。如果任何數字可被這些數字整除,它們也可被3整除。 由於該函數已經開始檢查數字是否可以被3整除,因此沒有必要進行檢查。 因此,我們需要檢查數字是否只能被以下項整除:

5 7 
11 13
17 19
23 25

等等

這些數字的模式是:

i i+2

行之間的增量為6。您可以將其轉換為:

  1. i = 5開始
  2. 檢查數字是否可以被ii+2整除。 如果是這樣,則返回false
  3. i遞增6然后重復。

這就是for循環的作用。

為什么for語句i*i <= n

那是因為一個數字不能被大於其平方根的任何數字整除。 如果到達i*i > n的點,則可以確保n不被i整除。 繼續循環大於等於i不會更改條件值。 當達到這一點時,該數字就是質數。

暫無
暫無

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

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