我可以猜测它与使用 unsigned long long int 有关。
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef unsigned long long int uint64;
int main(int argc, char *argv[])
{
uint64 number_in_question = 600851475143LL;
long double sqrt_in_question = sqrt(number_in_question);
bool primes_array[number_in_question+1];
for (uint64 i = 0; i <= number_in_question; i++) {
primes_array[i] = true;
}
for (uint64 i = 2; i <= sqrt_in_question; i++) {
if(primes_array[i] == true) {
// for every multiple of this prime, mark it as not prime
for (uint64 ii = i*2; ii <= number_in_question; ii += i) {
primes_array[ii] = false;
}
}
}
for (uint64 i = 0; i <= number_in_question; i++) {
if(primes_array[i] == true)
cout << i << ", ";
}
system("PAUSE");
return EXIT_SUCCESS;
}
Edit1:我正在尝试做的一些背景:
我正在尝试模仿这种技术:http ://en.wikipedia.org/wiki/Sieve_of_Eratosthenes 而我使用数组来存储一个简单的“是素数” 1 表示是,0 表示否。最终目标是解决这个问题:
What is the largest prime factor of the number 600851475143 ?
此处列出:http ://projecteuler.net/problem=3 。我只是在研究素数,然后再研究素数。
编辑2:
在查看我发布的 Wikipedia 链接后,我意识到他们有 puesdocode(跳过它并想出了我所拥有的)并意识到有这个注释:大范围可能不完全适合内存。在这些情况下,有必要使用分段筛,一次只筛分范围的一部分。 [14] 对于大到无法将筛选素数保存在内存中的范围,可以使用像 Sorenson 这样的节省空间的筛子。因此,我将不得不想办法使用“分段筛”方法来做到这一点。
编辑3:
更改了数组以考虑 [0] 元素,因此“问题”仅集中在数组内存大小太大而无法将来引用;还将数组存储为 bool 而不是 uint64。