关于质数的几个算法
- 试除法判定质数
- 试除法分解质因数
- 线性筛法求素数
试除法判定质数
给定$n$ 个正整数 $ai$,判定每个数是否是质数。
输入格式
第一行包含整数n。
接下来 $n$ 行,每行包含一个正整数 $ai$。
输出格式
共 $n$ 行,其中第 $i$ 行输出第 $i$个正整数ai是否为质数,是则输出“Yes”,否则输出“No”。
数据范围
1≤n≤1001≤n≤100,
1≤ai≤231−11≤ai≤231−1
输入样例:
2
2
6
输出样例:
Yes
No
模板参考:
bool is_prime(int x){
if(x<2) return 0;
for(int i=2;i<=x/i;i++)
if(x%i==0) return false;
return true;//在循环外面
}
试除法分解质因数
给定 $n$ 个正整数$ai$,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。
输入格式
第一行包含整数$n$。
接下来$n$行,每行包含一个正整数$ai$。
输出格式
对于每个正整数$ai$,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。
每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围
1≤n≤1001≤n≤100,
1≤ai≤2∗1091≤ai≤2∗109
输入样例:
2
6
8
输出样例:
2 1
3 1
2 3
模板参考:
void divide(int x){
for(int i = 2;i <= x/i;i++ )
if(x % i== 0){
int s=0;
while(x % i == 0){
x/=i;
s++;
}
cout<< i <<" "<< s <<endl;
}
if(x > 1) cout<< x <<" "<< 1<<endl;
}
线性筛法求素数( 欧拉筛 )
给定一个正整数$n$,请你求出$1-n$中质数的个数。
输入格式
共一行,包含整数$n$。
输出格式
共一行,包含一个整数,表示$1-n$中质数的个数。
数据范围
1≤n≤1061≤n≤106
输入样例:
8
输出样例:
4
模板参考
int primes[N], cnt; // primes[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
int get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
return cnt;//素数的个数
}