素数生成问题,解法主要分为试除法和筛选法两种,筛选法里又有很多算法,这里各实现一种比较方便且容易理解的方法,用来生成1到n之间的素数。
1.试除法
bool IsPrime(int num)
{
if(num < 2)
return false;
if(num == 2)
return true;
if(num % 2 == 0)
return false;
for(int i = 3; i <= sqrt(num); ++i)
{
if(num % i == 0)
return false;
}
return true;
}
void MakePrime(int n)
{
for(int i = 1; i < n + 1; ++i)
{
if(IsPrime(i))
cout << i << " ";
}
cout << endl;
}
2.筛选法
先声明一个大小为n+1的bool数组,先把下标为奇数的声明为true,下标为偶数的声明为false。然后对于素数,它的倍数全都声明为false,剩下的为true的数组下标即为素数。
void MakePrime(int n)
{
bool prime[n+1] = {false};
prime[2] = true;
for(int i = 3; i < n+1; i += 2)
prime[i] = true;
for(int i = 3; i <= sqrt(n); i += 2)
{
if(prime[i])
{
for(int j = 2*i; j < n+1; j += i)
prime[j] = false;
}
}
//打印
for(int k = 1; k < n+1; ++k)
{
if(prime[k])
cout << k << " ";
}
cout << endl;
}