算法学习笔记三 质数
一、判断是否为质数
基本原理:质数,即不被除了1和本身的所有数整除,于是从2开始进行遍历,很显然只要遍历到自身的根号,如果还没有找到一个可以被整除的数,那说明就是质数了;只要找到一个就说明不是质数。
bool isprime(int a)
{
for (int i = 2; i < sqrt(a); i++)
{
if (a % i == 0)
return false;
}
return true;
}
二、埃筛求素数
埃筛是一种求解素数相关题目的常见做法,作用是做好max以下的所有数据的是否为质数的标记。
基本原理:首先确定2、3是素数中最小的两个,然后开始遍历2的所有倍数,只要是2的倍数,就标记为不是素数;然后标记3的所有倍数…;然后注意到4已经标记为不是素数了所以跳过;然后标记5的所有倍数…多轮标记下来就可以得到max以下所有数据的标记了。
如果要输出,刚好数组的下标就是该数字,输出下标即可。
#include <iostream>
using namespace std;
int main() {
const int max = 10000;
int prime[max];
for (int i = 0; i < max; i++) prime[i] = 1; //1表示为素数
prime[0] = prime[1] = 0; //特殊处理,排除0和1
for (int i = 2; i < max; i++)
{
if (!prime[i]) //如果标记为0,即不是素数,就跳过这一个数字
continue;
else //如果标记为1,那么这个是素数,其倍数也就不是素数
{
for (int j = i * 2; j < max; j = j + i)
prime[j] = 0;
}
} //得到10000以内的所有素数
}