[英]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。您可以將其轉換為:
i = 5
開始 i
或i+2
整除。 如果是這樣,則返回false
。 i
遞增6
然后重復。 這就是for
循環的作用。
為什么for
語句i*i <= n
?
那是因為一個數字不能被大於其平方根的任何數字整除。 如果到達i*i
> n
的點,則可以確保n
不被i
整除。 繼續循環大於等於i
不會更改條件值。 當達到這一點時,該數字就是質數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.