簡體   English   中英

運行時錯誤,使我的.exe崩潰,我不確定為什么

[英]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。

您正在嘗試分配長度為600851475143uint64數組。 對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM