NO.1 试除法判定质数
题目:
给定 n 个正整数 ai,判定每个数是否是质数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai 。
输出格式
共 n 行,其中第 i 行输出第 i 个正整数 ai是否为质数,是则输出
Yes
,否则输出No
。
数据范围
1 ≤ n ≤ 100 , 1 ≤ ai ≤ 2^31 − 1
输入样例:
2
2
6
输出样例:
Yes
No
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int t;
bool zhi(int x){
if(x < 2) return false;
for(int i = 2;i <= x / i;i ++){ //为了防止i溢出,使用i <= x/i,不使用i <= sqrt(x)
if(x % i == 0)
return false;
}
return true;
}
int main(){
cin >> t;
while(t --){
int n;
cin >> n;
if(zhi(n))
cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
NO.2 分解质因数
题目:
给定 n 个正整数 ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。
每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围
1 ≤ n ≤ 100 , 2 ≤ ai ≤ 2 × 10^9
输入样例:
2
6
8
输出样例:
2 1
3 1
2 3
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int t;
int main(){
scanf("%d",&t);
while(t --){
int n;
cin >> n;
for(int i = 2;i <= n / i;i ++){
if(n % i == 0){
int ans = 0;
while(n % i == 0){
n /= i;
ans ++;
}
cout << i << ' ' << ans << endl;
}
}
if(n > 1) cout << n << ' ' << 1 << endl;
cout << endl;
}
return 0;
}
前方高能!!!上难度了
NO.3 筛质数
1 . 埃氏筛
板子:
void get_primes1(){
for(int i = 2;i <= n;i ++){
if(!st[i]){
primes[cnt ++]=i;
for(int j = i;j <= n;j += i)
st[j]=true;
}
}
}
2 . 线性筛
板子:
void get_primes(){
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;
}
}
}
题目:
给定一个正整数 n,请你求出 1∼n 中质数的个数。
输入格式
共一行,包含整数 n 。
输出格式
共一行,包含一个整数,表示 1∼n 中质数的个数。
数据范围
1 ≤ n ≤ 10^6
输入样例:
8
输出样例:
4
代码:
1.埃氏筛
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e8 + 10;
int n;
int primes[N],cnt;
bool st[N];
void get_primes(){
for(int i = 2;i <= n;i ++){
if(!st[i]){
primes[cnt ++] = i;
for(int j = i;j <= n;j += i){
st[j] = true;
}
}
}
}
int main(){
cin >> n;
get_primes();
cout << cnt << endl;
return 0;
}
2.线性筛
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e8 + 10;
int primes[N],cnt;
bool st[N];
int n;
void get_primes(){
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;
}
}
}
int main(){
cin >> n;
get_primes();
cout << cnt << endl;
return 0;
}