基本原理:发现一个素数后,该素数的所有倍数均为非素数。
通过这个办法,从素数2开始,不断将非素数标记出来,没有被标记的就是素数,从而逐步筛出素数。(注意:1不是素数)
/*利用素数筛法求出一段范围内的素数*/
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
int num[10005]; //非素数为1,素数为0
int sushu[3000];
int numSu = 0; //记录素数个数
//核心代码:素数筛法
void init()
{
for(int i=2;i<=10001;i++){
if(num[i] == 1) continue; //不是素数,下一个
else{ //若没有被标记为1,则说明它是素数,不需要专门验证
sushu[++numSu] = i;
//得到新素数后,将更多未知的数确定为非素数
for(int j=i*i;j<=10002;j+=i){
num[j] = 1;
}
}
}
}
int main()
{
init(); //得到1~10000之间所有素数,注意:1不是素数!!!
int x;
scanf("%d",&x);
for(int i=1;i<=numSu;i++){
if(sushu[i]<x && sushu[i]%10==1){
cout<<sushu[i]<<" ";
}
}
return 0;
}
通过素数筛法,可以对数字进行质因数分解,如下例题:
/*求正整数素因数的个数*/
#include <iostream>
#include <stdio.h>
using namespace std;
//素数找到10^5即可
int num[100005]; //素数为0
int sushu[10000];
int numSu;
long long int n; //输入数据
int ans;
void init()
{
for(int i=2;i<=100002;i++){
if(num[i] == 1) continue;
else if(i>1000) continue;
else{
sushu[++numSu] = i;
for(int j=i*i;j<=100002;j+=i){
num[i] = 1;
}
}
}
}
int main()
{
init();
scanf("%d",&n);
int i=1;
while(n!=1){
while(n%sushu[i] == 0){
n = n/sushu[i];
ans++;
}
i++;
}
cout<<ans;
return 0;
}