查找数字是否为素数 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 << "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。您可以将其转换为:
- 从
i = 5
开始 - 检查数字是否可以被
i
整除或i+2
。如果是这样,请返回false
。
按 6
递增i
并重复。
这就是for
循环的作用。
为什么for
语句的条件i*i <= n
?
这是因为一个数字不能被任何大于其平方根的数字整除。 如果你达到i*i
>n
的点,你确信n
不能被i
整除。对于任何大于此值的i
继续循环不会更改条件的值。当我们到达该点时,该数字是质数。
嗯,这是检查数字质数性质的经典算法之一。所以基本上,你在循环开始之前检查 2 和 3 的可整除性。
然后为了与其他数字进行核对,您从 5 开始,直到那个i*i = n
。这是因为可被任何数整除的数n
i
总是意味着数i
小于n
的平方根。您可以通过各种示例进行验证。说37。i*i>n
6
的最小数字,因此,您只需要检查它直到数字6
,并且不需要提前检查,因为您已经检查了所有其他倍数。因此,如果您在这里找不到超出6
的任何数字,则无需进一步检查。
第二部分是另一个条件,您将递增 2 以检查if
条件。这是因为您通过5
开始可除性,并且每次都按6
递增它。通过这样做,您可以确保只检查可除性检验的可能质数,而不检查任何其他质数。
我希望逻辑现在很清楚了。随时在评论中提出任何问题。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组