【发布时间】:2015-03-19 04:06:37
【问题描述】:
就像question 一样,我也在研究 Eratosthenes 的筛子。同样来自“使用 c++ 的编程原理和实践”一书,第 4 章。我能够正确实现它,并且它的功能与练习所要求的完全一样。
#include <iostream>
#include <vector>
using namespace std;
int main() {
unsigned int amount = 0;
cin >> amount;
vector<int>numbers;
for (unsigned int i = 0; i <= amount; i++) {
numbers.push_back(i);
}
for (unsigned int p = 2; p < amount; p++) {
if (numbers[p] == 0)
continue;
cout << p << '\n';
for (unsigned int i = p + p; i <= amount; i += p) {
numbers[i] = false;
}
}
return 0;
}
现在,我将如何处理amount 输入中的实数? unsigned int 类型应该允许我输入 2^32=4,294,967,296 的数字。但我不能,我的内存用完了。是的,我已经算过:存储 2^32 个 int 数量,每个 32 位。所以 32/8*2^32=16 GiB 的内存。我只有 4 GiB...
所以我在这里真正要做的是将非素数设置为零。所以我可以使用布尔值。但是,它们仍然需要 8 位,因此每个 1 字节。理论上我可以达到unsigned int (8/8*2^32=4 GiB) 的极限,将我的一些交换空间用于操作系统和开销。但是我有一台 x86_64 的 PC,那么大于 2^32 的数字呢?
知道素数是important in cryptography,一定有更有效的方法吗?还有没有办法优化找到所有这些素数所需的时间?
【问题讨论】:
标签: c++ primes sieve-of-eratosthenes