2012-12-20 42 views
6

我有這個簡單的程序:的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; 
} 

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

+1

你看到它在你的任務管理器/ ps中運行嗎? – amit

+0

您的編譯命令不會生成可執行文件,只是一個目標文件。你有鏈接步驟嗎? –

+5

嘗試'cout <<「Test」<< endl;'endl'刷新流,一次(即很少見)是一件好事。 –

回答

7

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

您未看到「測試」的原因可能是您沒有刷新輸出。試試:

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

啊,現在它正在沖洗。謝謝!我只需要檢查我的循環... –

+1

@ihsoyih我更新了。這不僅需要很長時間,而且還需要永久。 –

+4

@ihsoyih只是將內循環中的'1'改爲'2'。 –

2

您的程序正在運行。執行需要很長時間。

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

1

你是否試圖從2開始你的條件?該模塊功能沒有意義,如果開始從1

如果(!(NUM%I))

民/ 1 0給予,這樣你就不會在if條件進入

+0

哈哈,是的。數學的問題。 –

0

你的循環是一個無限循環。您找到的第一個因子是1(因爲num % 10),因此您將num除以1,這導致num重新進入for循環,該循環反覆進行。

此外,對於此固定(在與2循環中初始化i),您的內循環最有可能是無限循環和/或導致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土地作爲有符號整數不包裹在C++中。你的代碼可能無限循環,或者做一些事情,比如記錄-1作爲一個有效的因素,或者讓你懷孕。

你可以很容易觀察到,通過添加一些

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

for循環。