我们直接抓住素筛的核心:
定理: 如果n不是素数, 则n有满足1
I1. 如果n不是素数, 则n有满足1
I3. 令n=d, 并转到步骤I1.
由于不可能无限分解n的因子, 因此上述证明的算法最终会停止.
代码:
// primes[i]是递增的素数序列: 2, 3, 5, 7, ...
// 更准确地说primes[i]序列包含1->sqrt(n)范围内的所有素数
// 如何高效构造primes[]?需要多少个素数才能判断2^31-1内的所有素数?一会会有说明
int isPrime(int primes[], int n)
{
if(n < 2) return 0;
for(int i = 0; primes[i]*primes[i] <= n; ++i)
if(n % primes[i] == 0) return 0;//对应上述“n有素因子,n是合数”
return 1;
}
构造素数序列primes[i]: 2, 3, 5, 7, ...
// 构造素数序列primes[]
void makePrimes(int primes[], int num)
{
int i, j, cnt;
primes[0] = 2;
primes[1] = 3;
for(i = 5, cnt = 2; cnt < num; i += 2)//cnt为primes下标,i+=2筛去了偶数
{
int flag = 1;
for(j = 0; primes[j]*primes[j] <= i; ++j)
{
if(i%primes[j] == 0)
{
flag = 0; break;
}
}
if(flag) primes[cnt++] = i;
}
}