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

Finding whether a number is prime or not c++

本文关键字:c++ 数字 是否 查找      更新时间:2023-10-16
#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 << "Primen": cout << "Not primen";
}
return 0;
}

嘿,所以我正在研究这段代码来查找一个数字是否是素数, 我做了很多研究,但我找不到这一步的工作。

在 isprime() 函数中

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+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. 检查数字是否可以被i整除或i+2。如果是这样,请返回false
  3. 6递增i并重复。

这就是for循环的作用。

为什么for语句的条件i*i <= n

这是因为一个数字不能被任何大于其平方根的数字整除。 如果你达到i*i>n的点,你确信n不能被i整除。对于任何大于此值的i继续循环不会更改条件的值。当我们到达该点时,该数字是质数。

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

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

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

我希望逻辑现在很清楚了。随时在评论中提出任何问题。