【发布时间】:2014-10-29 12:53:12
【问题描述】:
我有这个 sn-p 代码,它可以在足够长的时间内使用埃拉托色尼筛法在“max”上生成素数。
我想为函数提供使用起始值来计算素数范围的可能性。所以我想知道在算法中的什么时候我必须交出起始值..
例如
get_primes(unsigned long from, unsigned long to);
get_primes(200, 5000);
-> 将 200 到 5000 的素数保存在向量中。
很遗憾,我并不完全理解算法。 [特别是第 3 到 5、7 和 10 行不清楚]
我尝试使用调试器按照这些步骤进行操作,但这并没有让我变得更聪明。
如果有人能更好地向我解释这段代码并告诉我如何设置起始值,那就太好了。
谢谢。
vector<unsigned long long> get_primes(unsigned long max) {
vector<unsigned long long> primes;
char *sieve;
sieve = new char[max / 8 + 1];
memset(sieve, 0xFF, (max / 8 + 1) * sizeof(char));
for (unsigned long long x = 2; x <= max; x++)
if (sieve[x / 8] & (0x01 << (x % 8))) {
primes.push_back(x);
for (unsigned long long j = 2 * x; j <= max; j += x)
sieve[j / 8] &= ~(0x01 << (j % 8));
}
delete[] sieve;
return primes;
}
【问题讨论】:
-
char *sieve用作大位域。 -
从循环中删除
primes.push_back(x);;之后在筛子上迭代你的间隔。您不理解的部分使用“聪明”的位移将八个标志位存储在char(应该是无符号的)中。 -
你可能会喜欢我对 Eratosthenes 分段筛的解释:http://stackoverflow.com/questions/10249378/segmented-sieve-of-eratosthenes
-
你描述的是一个offset sieve of Eratosthenes(伪代码并链接到那里的C代码) - 你在其中筛选一个高达
sqrt(y)的核心,以及来自@的一个附加段987654330@ 到y使用核心中的素数。 “分段”筛指的是不断发现素数,一段接一段。
标签: c++ c algorithm primes sieve-of-eratosthenes