数学问题——素数
Posted 牧空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学问题——素数相关的知识,希望对你有一定的参考价值。
方法
- 最基础就是使用小于该整数的所有整数去试着整除这个数 n n n
- 进一步,将尝试范围缩小到 n \\sqrt{n} n
- 使用筛法,找出范围内的所有素数
- 找到一个素数,就将它的所有倍数均标记为非素数
- 若遍历到某个数是,若未被任何小于它的素数标记为非素数,则它为素数
代码
基础
bool isPrime(int n){
if(n == 0 || n == 1) return false;
for(int i = 2; i * i <= n; i++)
if(n % i == 0) return fasle;
return true;
}
在基础之上剪枝
bool isPrime(int n){
if (n <= 3)
return n > 1;
if (n % 6 != 1 && n % 6 != 5)
return false;
int sq = sqrt(n);
for (int i = 5; i <= sq; i += 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
筛法
bool isPrime[MAX]; // 标记数组
vector<int> prime; // 素数数组
void Initial()
{
for (int i = 0; i < MAX; i++)
{
isPrime[i] = true;
}
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i < MAX; i++)
{
if (!isPrime[i])
continue;
prime.push_back(i);
for (int j = i * i; j < MAX; j += i)
{
isPrime[j] = false;
}
}
return ;
}
对上述代码的几点说明
- 其中
prime
数组是升序排列的 - 第二层for循环中
j = i * i
开始是因为在前面的遍历中,2i,3i,...,(i-1)*i(如果i-1也是素数的话)
已经被置为非素数了,所以不必要再从i开始
以上是关于数学问题——素数的主要内容,如果未能解决你的问题,请参考以下文章