一. 试除法判定质数
题目来源:试除法判定质数
#include<bits/stdc++.h>
using namespace std;
bool is_prime(int n)
{
if(n==1) return false;
for(int i=2;i<=n/i;i++)
{
if(n%i==0) return false;
}
return true;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
if(is_prime(a)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
二. 分解质因数
题目来源:分解质因数
#include<bits/stdc++.h>
using namespace std;
void divide(int n)
{
for(int i=2;i<=n/i;i++)
{
//n不包含任何从2到i-1之间的质因子(已经被除干净了)
//(n%i==0)所以i也不包含何从2到i-1之间的质因子,由质数的定义可知,保证了i是质数
if(n%i==0) //此时i是质数
{
int s=0;
while(n%i==0) n/=i,s++;
printf("%d %d\n",i,s);
}
}
if(n>1) printf("%d %d\n",n,1);//最多只有一个大于根下n的质因子
puts("");
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
divide(a);
}
}
三. 筛质数
题目来源: 筛质数
(1)朴素筛法
#include <iostream>
using namespace std;
const int N = 1e6+10;
int prime[N], cnt;
bool st[N];
//朴素筛法-O(nlogn)删除每个数的倍数
void get_primes(int n)
{
for(int i = 2; i <= n; i++)
{
if(!st[i])
{
prime[cnt++] = i; //如果i没有被删,即使质数加入
}
for(int j = 2*i; j <= n; j =j + i)
st[j] = true; //删除每个数的倍数即是2*i 3*i 4*i.....
}
}
int main()
{
int x;
cin >> x;
get_primes(x);
cout << cnt << endl;
return 0;
}
(2)埃式筛法
#include <iostream>
using namespace std;
const int N = 1e6+10;
int prime[N], cnt;
bool st[N];
//埃式筛法-O(nloglogn)删除每个质数的倍数(每个合数会被它的每一个质因子筛一次)
void get_primes(int n)
{
for(int i = 2; i <= n; i++)
{
if(!st[i])
{
prime[cnt++] = i;
for(int j = 2*i; j <= n; j += i)
st[j] = true; //删除每个质数的倍数即是2*i 3*i 4*i.....
}
}
}
int main()
{
int x;
cin >> x;
get_primes(x);
cout << cnt << endl;
return 0;
}
(3)线性筛法
#include <iostream>
using namespace std;
const int N = 1e6+10;
int prime[N], cnt;
bool st[N];
//线性筛法-O(n),(合数只会被它的最小质因子筛掉)
//n = 1e7的时候基本就比埃式筛法快一倍了
void get_primes(int n)
{
for(int i = 2; i <= n; i++)
{
if(!st[i]) prime[cnt++] = i; //i没有被筛掉,即质数加入
//i不变,j变化
for(int j = 0; prime[j] <= n / i; j++)
{
//删除合数pj[]*i;
st[prime[j]*i] = true;
//找到i的最小质因子,因为pj从小到大排列
if(i % prime[j] == 0) break;
//1.i%pj == 0, pj定为i最小质因子,pj也定为pj*i最小质因子
//2.i%pj != 0, pj定小于i的所有质因子,所以pj也为pj*i最小质因子
}
}
}
int main()
{
int x;
cin >> x;
get_primes(x);
cout << cnt << endl;
return 0;
}