不用说,上代码(求到n的质数)
埃式筛:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
#include<vector>
#include <iostream>
#include <vector>
using namespace std;
// 埃拉托斯特尼筛法
vector<int> sieveOfEratosthenes(int n) {
vector<bool> isPrime(n+1, true); // 初始化,假设所有数都是素数
isPrime[0] = isPrime[1] = false; // 0和1不是素数
for (int p = 2; p*p <= n; p++) {
if (isPrime[p]) {
// 将p的倍数标记为非素数
for (int i = p*p; i <= n; i += p)
isPrime[i] = false;
}
}
// 收集所有素数
vector<int> primes;
for (int i = 2; i <= n; i++) {
if (isPrime[i])
primes.push_back(i);
}
return primes;
}
int main() {
int n;
cout << "请输入一个正整数n: ";
cin >> n;
vector<int> primes = sieveOfEratosthenes(n);
cout << "小于等于" << n << "的素数有: ";
for (int prime : primes) {
cout << prime << " ";
}
cout << endl;
return 0;
}
欧拉筛:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
#include<vector>
using namespace std;
// 欧拉筛法
vector<int> sieveOfEuler(int n) {
vector<bool> isPrime(n+1, true); // 初始化,假设所有数都是素数
vector<int> primes;
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
primes.push_back(i); // 如果i是素数,则将其加入素数列表
}
// 使用已知的素数来标记合数
for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
isPrime[i * primes[j]] = false;
if (i % primes[j] == 0) {
break; // 确保每个合数只被其最小的素因子标记
}
}
}
return primes;
}
int main() {
int n;
cout << "请输入一个正整数n: ";
cin >> n;
vector<int> primes = sieveOfEuler(n);
cout << "小于等于" << n << "的素数有: ";
for (int prime : primes) {
cout << prime << " ";
}
cout << endl;
return 0;
}