2012-12-20 46 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循环。