我可以猜測它與處理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。
你爲什麼懷疑'unsigned long long int'是罪魁禍首?你在調試器中運行應用程序嗎?什麼是違規線? – 2012-01-12 16:00:05
Dev-C++不讓我正確調試它。剛剛下載了一個編譯器(流血的dev-C++)並且遇到了這個問題,一段時間沒有用過C++。也許我會嘗試另一個編譯器。 – ParoX 2012-01-12 16:03:06
'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