1.查表法
设置一张表(动态数组),用来记录一定范围内的数是否为质数,本方法的主要思想是在一定范围内分别标记2、3、5、7......的倍数(2,3,4......),被标记的数则不是质数,最后那目标范围和表比对即可
代码如下(C++):
#include <bits/stdc++.h>
using namespace std;
//查表法求质数
int main() {
const int MAXA = 100;
// 预处理:求出所有小于等于 1e6 的质数
bool inited = false;
bool flag[MAXA + 10];//质数表
vector<int> prime;
if (!inited)
{
inited = true;
for (int i = 2; i * i <= MAXA; i++)
if (!flag[i])
// 2为质数,开始i * 2;
for (int j = i * 2; j <= MAXA; j += i)
flag[j] = true;//筛除那些不是质数
for (int i = 2; i <= MAXA; i++)
if (!flag[i])//判断质数
prime.push_back(i);
}
for(int i = 0; i < prime.size(); i ++)
{
cout << prime[i] << endl;
}
return 0;
}
2.试除法
简单来说就是让目标数除以{2,3,5,7,11,13,17,19(一般20以内的质数即可)},一旦余数为零,则为非质数,剩下的即位以及相等(此判断条件在前)即为质数
代码如下(C++)
#include <bits/stdc++.h>
using namespace std;
//试除法求质数
int main() {
vector<int> prime;
vector<int> a = {2,3,5,7,11,13,17,19};
int flag = 1;
for (int i = 2; i <= 100; i ++)
{
flag = 1;
for(int j = 0; j < a.size(); j ++)
{
if(i == a[j])
{
//cout << "a";
//cout << i << endl;
prime.push_back(i);
flag = 0;
break;
}else if(i % a[j] == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
{
//cout << "b";
prime.push_back(i);
}
}
for(int i = 0; i < prime.size(); i ++)
cout << prime[i] << endl;
return 0;
}