标签:
下面是埃拉托斯特尼筛法的实现代码:
boolean[] sieveOfEratosthenes(int max)
{
boolean[] flags = new boolean[max + 1];
int count = 0;
init(flags);//将flags中0,1元素除外的所有元素设为true
int prime = 2;
while (prime <= max)
{
//划掉余下为prime倍数的数字
crossOff(flags, prime);
//找出下一个为true的值
prime = getNextPrime(flags, prime);
if (prime >= flags.length)
{
break;
}
}
return flags;
}
void crossOff(boolean[] flags, int prime)
{
/*划掉余下为prime倍数的数字,我们可以从
(prime*prime)开始,因为如果k*prime且k<prime,
这个值早就在之前的迭代里被划掉了*/
for (int i = prime*prime, i < flags.length; i += prime)
{
flags[i] = false;
}
}
int getNextPrime(boolean[] flags, int prime)
{
int next = prime + 1;
while (next < flags.length&&!flags[next])
{
next++;
}
return next;
}
上面的代码中有一些地方可以优化,比如只将奇数放入数组,所需空间即可减半。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wangfengfan1/article/details/47621897