#define N 100000000
求1~N中的素数个数;
// 方法一: 直接判断n是否为素数 n为正整数</span>
bool IsPrime1(int n) // 在VS2010中运行时间为239秒
{
int i;
if (n == 1) return false;
for (i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
// 方法二:直接判断n是否为素数 n为正整数
bool IsPrime2(int n) // 在VS2010中运行时间为121秒
{
int i;
if (n == 1) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (i = 3; i * i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
<pre name="code" class="cpp">/*
** 筛选法一:
** 开一个大的bool型数组prime[],大小为n+1.
** 先把所有的下标为奇数的标为true,下标为偶数的标为false
*/
void IsPrime3(int n, bool prime[]) // 在VS2010中运行时间为3秒
{
int i, j;
for (i = 3; i <= sqrt(1.0 * n); i += 2)
{
if(prime[i])
{
for (j = i + i; j <= n; j += i)
prime[j] = false;
}
}
}
/*
** 筛选法二:
** bool型数组里面只存奇数不存偶数。如定义prime[N],则0表示3,1表示5,2表示7,3表示9...,
** 如果prime[0]为true,则表示3时素数。prime[3]为false意味着9是合数。
**
*/
void IsPrime4(int n, bool prime[]) // 在VS2010中运行时间为1秒
{
int i, j;
for (i = 0; 2 * i + 3 <= sqrt(1.0 * n); i += 1)
{
if(prime[i])
{
for (j = i + 2 * i + 3; j <= n / 2; j += 2 * i + 3)
prime[j] = false;
}
}
}
素数定理:
1~n范围内的素数个数极限为n/ln(n);