簡體   English   中英

main()沒有執行,而是編譯

[英]main() not executing, but compiling

我有這個簡單的程序:

// 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證明是成功的,但是當我運行它時我什么都沒看到它只是繼續運行而且我最終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 = 1 to for (int i = 2

那些嵌套循環將永遠循環。 內部for循環只會因為break而執行一次,因此它只會執行num /= 1 這意味着num永遠不會減少,所以num > 1永遠不會是false。 我想你只需要等待更長時間!

您沒有看到“測試”的原因可能是因為您沒有刷新輸出。 嘗試:

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

你的程序只是運行。 執行需要很長時間。

對於cout << "Test\\n"; ,這是cout流未被刷新的問題:你寫入流的內容仍然在你的程序存儲器中,還沒有刷新到要打印的系統。

你有沒有試過從2開始你的狀態? 如果從1開始,模塊功能沒有意義。

if(!(num%i))

Num / 1給0,所以你沒有輸入if條件

你的循環是一個無限循環。 你找到的第一個因素是1(因為num % 10 ),因此你將num除以1 ,這導致num重新進入for循環,它會一次又一次地執行相同的操作。

同樣使用此修復(在循環中使用2初始化i ),內部for循環很可能是無限循環和/或導致UB。 否則(正如其他人所述)它“只是”運行很長時間。 對於不同的情況(假設這里最常見的平台)。 這取決於您嘗試計算的值,如果第一個因子小於std::numeric_limits<int>::max()那么這不適用。 讓我們稱之為素數BIGPRIME600851475149就是一個很好的例子)。

long long int大小至少為64位。 在大多數平台上int不太可能大於32位,所以當你的平台上不大於它時,它只能達到std::numeric_limits<int>::max() ,這是(再次假設這里是常見的32位平台) 2147483647然后在與long long int的比較中被提升,但保持其值,該值始終小於BIGPRIME 總是增加i永遠不會到達任何地方,一旦你在max()你輸入UB land,因為有符號整數不包含在C ++中。 你的代碼可能在那里無限循環,或做一些事情,如記錄-1作為有效因素,或讓你懷孕。

您可以通過添加一些來輕松觀察

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

進入for循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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