私はそれが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の場合は0です。最終的な目標はこれを解決することです:
What is the largest prime factor of the number 600851475143 ?
ここに掲載されている:http://projecteuler.net/problem=3。私はちょうど素数に取り組んでいますし、素因について作業します。
EDIT2:
私が投稿ウィキペディアのリンクを見ていたら、私は彼らがpuesdocodeが(その上でスキップされ、私が持っているものを思い付いた)とこのノートを持っていたことに気づいてい実現: 大きな範囲が完全に適合しない場合がありますメモリ内にある。これらの場合には、範囲の一部のみが一度にふるい分けされるセグメント化された篩を使用する必要がある。ふるい分けの素数がメモリに保持されないほど大きい範囲については、代わりにソレンソンのような空間効率の良いふるいが使用されます。 したがって、私はこれを "分割篩"法を用いて行う方法を考えなければならないでしょう。
EDIT3:
「問題は」だけアレイメモリのサイズは、将来の参照のためには大きすぎることに焦点を当てているので、[0]の要素を考慮して、配列を変更しました。また、uint64の代わりにboolとして配列を格納しました。
なぜ「unsigned long long int」が原因であると思われますか?デバッガでアプリケーションを実行しましたか?違反行とは何ですか? –
Dev-C++は正しくデバッグできません。しばらくの間、C++で作業していないのですが、コンパイラをダウンロードして(devs-C++)、この問題に取り組んでいます。おそらく私は別のコンパイラを試してみるでしょう。 – ParoX
'uint64 primes_array [number_in_question];' - それは実際にコンパイルされますか? number_in_questionは、定義や列挙ではなく、ランタイム変数です。また、 'uint64 primes_array [] = new uint64 [number_in_question + 1];' – pelya