6

私はこの簡単なプログラムを持っています:

// 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;
}

でのコンパイルg++ -O2 -c -o prob3.o prob3.cppは成功したことが証明されましたが、実行すると何も表示されず、実行が継続され、最後に Ctrl-C (強制終了) する必要がありました。追加しようとすると

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

プログラムに、Testあまりにも印刷されませんでした。私のプログラムがまったく実行されていないようです。

ヘルプやアドバイスをいただければ幸いです。

解決

2 から始まる素数を忘れていました。 に変更for (int i = 1for (int i = 2ます。

4

4 に答える 4

7

これらのネストされたループは永遠にループします。内側のforループbreaknum /= 1. つまり、num決して減少しないため、num > 1false になることはありません。もっと待つ必要があると思います!

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

std::cout << "Test" << std::endl;
于 2012-12-20T15:22:12.450 に答える
2

プログラムは単に実行されています。実行に時間がかかります。

の場合、ストリームがフラッシュされないことcout << "Test\n";が問題になりcoutます。ストリームに書き込んだ内容は、プログラムメモリに残っており、印刷するシステムにまだフラッシュされていません。

于 2012-12-20T15:23:23.287 に答える
1

for 条件を 2 から開始しようとしましたか? モジュール関数は 1 から開始すると意味がありません。

if (!(num % i))

Num / 1 は 0 を与えるので、if 条件には入らない

于 2012-12-20T15:29:12.243 に答える
0

あなたのループは無限ループです。あなたが見つけた最初の因数は 1 であり ( num % 1is であるため)、その結果で0割りnum、for ループに再び入ります。これは同じことを何度も繰り返します。1num

また、これを修正すると (を使用iしてループで初期化する2)、内側の for ループが無限ループおよび/または UB を引き起こしている可能性が最も高くなります。そうでなければ(他の人が述べたように)、それは「ただ」非常に長く実行されています。それが異なる場合(ここでは最も一般的なプラットフォームを想定しています)。これは、因数分解しようとしている値によって異なります。最初の因数がそれよりも小さい場合std::numeric_limits<int>::max()、これは当てはまりません。それらの素数を呼び出しましょうBIGPRIME(600851475149良い例です)。

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

いくつか追加することで簡単に観察できます

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

forループに。

于 2012-12-20T15:34:07.723 に答える