繁体   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