素数的判断
代码1:
// 判断素数
bool isPrime01(int n)
{
if (n <= 1)return false;
int sqr = (int)sqrt(n * 1.0);
for (int i = 2; i <= sqr; ++i) {
if (n % i == 0)
cout << false;
}
return true;
}
代码2:
i*i有可能越界,因此可以使用long long 来定义 i
bool isPrime02(int n)
{
if (n <= 1)return false;
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0)
return false;
}
return true;
}
素数筛
bool isPrime02(int n)
{
if (n <= 1)return false;
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0)
return false;
}
return true;
}
// 素数筛
const int maxn = 1e5 + 10;
vector<int> primes; // primes存放所有素数
bool P[maxn]; //表示i是不是素数
void Find_prime01()
{
for (int i = 1; i < maxn; ++i) {
if (isPrime02(i) == true) {
primes.push_back(i);
P[i] = true;
}
}
}
埃氏筛
// 埃拉托斯特尼筛法(埃氏筛)
// 时间复杂度O(n*log(logn))
// true : 不是素数 false:是素数
const int maxn = 1e5 + 10;
vector<int> primes; // primes存放所有素数
bool P[maxn]; //表示i是不是素数
void Find_prime02()
{
for (int i = 2; i < maxn; ++i) {
if (P[i] == false) {
primes.push_back(i);
for (int j = i + i; j < maxn; j += i) {
P[j] = true;
}
}
}
}
欧拉筛
//欧拉筛
bool isPrime[100000001]; //判断是否是素数
vector<int> primes; //prime:存素数
void GetPrime(int n) //筛到n
{
for (int i = 2; i <= n; i++) {
if (isPrime[i] == false)
primes.push_back(i);
for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
isPrime[i * primes[j]] = true;
if (i % primes[j] == 0)
break;
}
}
}