2012-01-12 84 views
1

我可以猜測它與處理unsigned long long int有關。運行時錯誤,使我的.exe崩潰,我不知道爲什麼

#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。我正在研究素數,然後研究主要因素。

EDIT2:

在觀看維基百科的鏈接我張貼,我意識到他們有puesdocode(跳過了這一點,與我有什麼想出了),並意識到有這樣一個字條: 大的範圍可能並不完全適合在記憶中。在這些情況下,有必要使用分段篩,其中一次僅篩分部分範圍。[14]對於範圍如此之大以至於篩分質量不能保留在記憶中的情況,將使用像索倫森那樣的節省空間的篩。 因此,我將不得不想辦法使用「分段篩」方法來做到這一點。

EDIT3:

改變了陣列以考慮[0]元件所以「問題」只集中在所述陣列的存儲器大小是用於將來引用過大;還將該數組存儲爲bool而不是uint64。

+0

你爲什麼懷疑'unsigned long long int'是罪魁禍首?你在調試器中運行應用程序嗎?什麼是違規線? – 2012-01-12 16:00:05

+0

Dev-C++不讓我正確調試它。剛剛下載了一個編譯器(流血的dev-C++)並且遇到了這個問題,一段時間沒有用過C++。也許我會嘗試另一個編譯器。 – ParoX 2012-01-12 16:03:06

+0

'uint64 primes_array [number_in_question];' - 是否真的編譯? number_in_question是一個運行時變量,不是定義或枚舉。另外,代碼'for(uint64 i = 0; i <= number_in_question; i ++)'超出了數組維度,您應該像這樣分配它:'uint64 primes_array [] = new uint64 [number_in_question + 1];' – pelya 2012-01-12 16:05:50

回答

5

您正在嘗試分配長度爲600851475143uint64數組。對於8字節的uint64來說,這意味着這個陣列將佔用大約4.5TB內存的600851475143*8byte。即使你的系統可以分配那麼多的內存(不太可能),你也試圖把它放在堆棧上,而堆棧的大小通常只有幾MB。此外,您正嘗試寫入索引number_in_question,而陣列中的最後一個索引是number_in_question-1

+0

4.5TB內存,我希望。這說得通。此外,流血從來沒有給我錯誤的最後一個索引的東西,但我意識到我必須定義數組爲+ 1,因爲它有第0個元素。 – ParoX 2012-01-12 16:15:29

3

我會假設你試圖創建數組時吹的是堆棧。陣列的規模非常大,必須在堆上創建才能獲得成功。

+0

是的,我有同樣的意見,這個數組將被創建在堆棧上,但是你不能有這個大小的堆棧 – rkosegi 2012-01-12 16:03:35

+0

你甚至會在堆上遇到麻煩。現在很少有盒子帶有超過4TB的RAM + swap。 – 2012-01-12 16:19:54

0

你的數組包含「number_in_question」元素,編號爲0到number_in_question - 1。但是,for循環將嘗試訪問可用空間外的primes_array [number_in_question],如果該數組甚至會被分配給你。

爲什麼要分配一個uint64數組並在每個元素中存儲0或1?

編輯:另外,你不能在堆棧上分配一個像這樣的可變大小的數組。你必須使用new來分配堆上的空間。同樣,假設你的系統將允許你分配這麼多的空間。

+0

你是對的,出於某種原因,我認爲有一個uint64數量的元素將需要uint64類型,但數組應該被定義爲布爾值。這已修復編輯3. – ParoX 2012-01-12 16:39:48

相關問題