#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;
请帮助我弄清楚任何帮助表示赞赏
答案 0 :(得分:1)
嗯,这是用于检查数字的主要性质的经典算法之一。所以基本上,你是在循环开始之前检查2和3的可分性。
然后检查其他数字,从5开始直到i*i = n
。这是因为可以被任何数字n
整除的数字i
始终意味着数字i
小于n
的平方根。您可以通过各种示例进行验证。说37. i*i>n
为6
的最小数字因此,您需要检查它直到数字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.您可以将其转换为:
i i+2
i = 5
或i
整除。如果是,请返回i+2
。 false
增加i
并重复。 这就是6
循环的作用。
为什么条件是for
语句for
?
这是因为一个数字不能被任何大于其平方根的数字整除。如果您达到i*i <= n
&gt;的点i*i
,您确信n
不能被n
整除。继续任何大于i
的循环将不会更改条件的值。当我们达到这一点时,该数字是素数。