[英]Runtime error, makes my .exe crash and I am not sure why
我可以猜測,這與使用無符號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。
您正在嘗試分配長度為600851475143
的uint64
數組。 對於8字節的uint64
,這意味着該陣列將占用600851475143*8byte
,大約為4.5TB
的內存。 即使您的系統可以(不太可能)分配那么多的內存,您也嘗試將其放在通常只有幾MB大小的堆棧上。 此外,您嘗試寫入索引number_in_question
,而數組中的最后一個索引是number_in_question-1
。
我假設您在嘗試創建數組時正在炸毀堆棧。 陣列的大小非常大,必須在堆上創建才能獲得成功的機會。
您的數組具有“ number_in_question”元素,編號為0到number_in_question-1。但是,您的for循環將嘗試訪問primes_array [number_in_question],該空間超出了可用空間,即使該數組中的大部分甚至已分配給您。
為什么要分配uint64數組並在每個元素中存儲0或1?
編輯:同樣,您不能在堆棧上分配具有可變大小的數組。 您必須使用new來在堆上分配該空間。 同樣,假設您的系統將允許您分配那么多空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.