查找数字是否为素数c ++

时间:2018-02-21 17:12:59

标签: 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 个答案:

答案 0 :(得分:1)

嗯,这是用于检查数字的主要性质的经典算法之一。所以基本上,你是在循环开始之前检查2和3的可分性。

然后检查其他数字,从5开始直到i*i = n。这是因为可以被任何数字n整除的数字i始终意味着数字i小于n的平方根。您可以通过各种示例进行验证。说37. i*i>n6的最小数字因此,您需要检查它直到数字6并且不要超出提前检查,因为您已经检查了所有其他的倍数。因此,如果您在此处找不到6以外的任何数字,则无需进一步检查。

第二部分是检查if条件时递增2的另一个条件。这是因为您按5开始可分,并且每次都按6递增。通过这样做,您确保只检查可能性的素数而不是其他任何素数。

我希望现在逻辑清晰。随意在评论中提出任何疑问。

答案 1 :(得分:1)

循环

np.imag(my_imag_pie))()

本来可以写成:

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.

等,

您会注意到最后一列中的所有数字都是3的倍数。如果任何数字可以被这些数字整除,它们也可以被3整除。由于函数已经检查了数字在开头是否可以被3整除,因此没有必要检查它。因此,我们需要检查数字是否只能被整除:

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

这些数字的模式是:

5 7 
11 13
17 19
23 25

行之间的增量为6.您可以将其转换为:

  1. i i+2
  2. 开始
  3. 检查该号码是否可以被i = 5i整除。如果是,请返回i+2
  4. false增加i并重复。
  5. 这就是6循环的作用。

    为什么条件是for语句for

    这是因为一个数字不能被任何大于其平方根的数字整除。如果您达到i*i <= n&gt;的点i*i,您确信n不能被n整除。继续任何大于i的循环将不会更改条件的值。当我们达到这一点时,该数字是素数。