2012-12-20 3 views
6

をコンパイル:g++ -O2 -c -o prob3.o prob3.cppでコンパイルはmain()の実行していないが、私はこの単純なプログラムを持って

// Include libraries 

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

// Include locals 

// Start 

#define NUMBER 600851475143 

int main(int argc, const char* argv[]) 
{ 
    long long int ans = 0; 
    long long int num = NUMBER; 

    vector<int> factors; 

    do 
    { 
     // Get lowest factor 

     for (int i = 1; i <= num; ++i) 
     { 
      if (!(num % i)) 
      { 
       factors.push_back(i); 

       num /= i; 
       break; 
      } 
     } 
    } while (num > 1); 

    cout << "Calculated to 1.\n"; 

    int highestFactor = numeric_limits<int>::min(); 

    for (int i = 0; i < factors.size(); ++i) 
    { 
     if (factors[i] > highestFactor) 
     { 
      highestFactor = factors[i]; 
     } 
    } 

    ans = highestFactor; 

    cout << ans << endl; 

    return EXIT_SUCCESS; 
} 

は成功しますが、私はそれを実行したとき、私は何も見なかったし、それだけで走り続け、私はCtrlキーを押しながらCを持っていましたそれを最後に強制的に殺してください。追加しようとすると、プログラムにTestも表示されませんでした。

int main(int argc, const char* argv[]) 
{ 
    cout << "Test\n"; 

私のプログラムはまったく実行されないようです。

ご協力いただきありがとうございます。私は素数を忘れてしまった

ソリューションはfor (int i = 2に2.変更for (int i = 1で開始しました。

+1

タスクマネージャー/ psで実行されているように見えますか? – amit

+0

あなたのコンパイルコマンドは、オブジェクトファイルだけでは実行可能ファイルを生成しません。リンクステップもありますか? –

+5

'cout <<試してみてください。<< endl;' 'endl'はストリームをフラッシュします。これは一度だけ(つまりまれです)実行するのが良いことです。 –

答えて

7

これらのネストされたループは永遠にループします。内側のforループはbreakのため一度だけ実行されるので、num /= 1を実行します。つまり、numは決して減少しないので、num > 1は決して偽ではありません。私はあなたがちょうど長く待つ必要があると思います!

「テスト」が表示されない理由は、出力をフラッシュしなかったためです。お試しください:

std::cout << "Test" << std::endl; 
+0

ああ、今は流血です。ありがとう!私はちょうど私のループをチェックする必要があります... –

+1

@ihsoyih私は更新しました。それは長い時間を取るだけではなく、永遠に取っています。 –

+4

@ihsoyihは内部ループの '1'を' 2'に変更するだけです。 –

2

プログラムは実行中です。実行に時間がかかります。

coutストリームはフラッシュされません。ストリームに書き込んだ内容はまだプログラムメモリに残っており、印刷するシステムにまだフラッシュされていません。

1

forを2から開始しようとしましたか?スタートは1

から(!(num個の%のI))

のNum/1弾力0は、あなたがもし条件に入力していないので、場合場合は、モジュールの機能は意味を持たない

+0

lol、そう。数学の問題。 –

0

あなたのループは無限ループです。最初に見つけた要素は1(num % 10なので)です。num1で割った結果、numが再びforループに入り、何度も繰り返されます。

また、この固定(2のループ内でiを初期化する)では、内側forループは無限ループである可能性があります。そうでなければ(他の人が述べたように)、それは「ちょうど」非常に長く走っている。それが異なる場合(ここでは最も一般的なプラットフォームを仮定します)。これは因子化しようとしている値に依存しますが、最初の因子がstd::numeric_limits<int>::max()より小さい場合は適用されません。それらの素数をBIGPRIME600851475149)と呼ぶことができます。

long long intのサイズは少なくとも64ビットです。intはほとんどのプラットフォームでは32ビット以上になる可能性は低いので、プラットフォーム上でそれほど大きくない場合はと比較して昇格するstd::numeric_limits<int>::max()(ここでも共通の32ビットプラットフォームと仮定します)2147483647その値は常にBIGPRIMEより小さくなります。常に増加するiはどこにも決して行きません。そして、max()にいると、符号付き整数がC++でラップされないので、UBの土地に入ります。あなたのコードは無限ループかもしれません。あるいは、-1を有効な要素として記録するか、妊娠させてください。

あなたは簡単にforループにいくつかの

if(0 == (i%100000000)){ std::cout << i << std::endl; } 

を追加することによって、それを観察することができます。

関連する問題