Par*_*roX 1 c++ runtime-error int64 uint64
我可以猜测它与使用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;
}
Run Code Online (Sandbox Code Playgroud)
编辑1:我想要做的一些背景:
我试图模仿这种技术:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes 我正在使用一个数组来存储一个简单的"is it prime"1表示是,0表示否.最终目标是解决这个问题:
What is the largest prime factor of the number 600851475143 ?在此列出:http://projecteuler.net/problem=3.我正在研究素数,然后将研究素数因子.
EDIT2:
看了我发布的维基百科链接,我意识到他们有puesdocode(跳过那个并想出了我所拥有的)并意识到有这个说明:大范围可能不完全适合内存.在这些情况下,有必要使用分段筛,其中一次只筛分部分范围.[14] 对于如此大的范围,以至于筛分的质数不能保存在记忆中,而是使用类似于Sorenson的节省空间的筛子.因此,我将不得不考虑使用"分段筛"方法来实现这一目的.
EDIT3:
更改了数组以考虑[0]元素,因此"问题"仅关注数组内存大小太大而无法在将来引用; 还将数组存储为bool而不是uint64.
您正在尝试分配uint64长度数组600851475143.对于8字节uint64,这意味着该数组将占用600851475143*8byte大致4.5TB的内存.即使你的系统可以分配那么多内存(不太可能),你也试图将它放在堆栈上,堆栈的大小通常只有几MB.此外,您正在尝试写入索引number_in_question,而数组中的最后一个索引是number_in_question-1.