main()没有执行,而是编译

时间:2012-12-20 15:19:19

标签: c++ compilation runtime

我有这个简单的程序:

// 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 = 1更改为for (int i = 2

4 个答案:

答案 0 :(得分:7)

那些嵌套循环将永远循环。由于for,内部break循环只会执行一次,所以它只会执行num /= 1。这意味着num永远不会减少,因此num > 1永远不会是假的。我想你只需要等待更长时间!

您没有看到“测试”的原因可能是因为您没有刷新输出。尝试:

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

答案 1 :(得分:2)

您的程序正在运行。执行需要很长时间。

对于cout << "Test\n";,这是cout流未被刷新的问题:您写入流的内容仍在程序内存中,尚未刷新到要打印的系统。< / p>

答案 2 :(得分:1)

你有没有尝试从2开始你的状态?如果从1开始,模块功能没有意义。

if(!(num%i))

Num / 1给0,所以你没有输入if条件

答案 3 :(得分:0)

你的循环是一个无限循环。您找到的第一个因素是1(因为num % 10),因此您将num除以1,这会导致num重新进入for循环,它一次又一次地做同样的事。

此修复(在i循环中初始化2),内部for循环很可能是无限循环和/或导致UB。否则(正如其他人所述)它“只是”运行很长时间。对于不同的情况(假设这里最常见的平台)。这取决于您尝试计算的值,如果第一个因子小于std::numeric_limits<int>::max(),那么这不适用。让我们调用那些素数BIGPRIME600851475149就是一个很好的例子。)

long long int的大小至少为64位。 int在大多数平台上都不可能大于32位,所以当你的平台上它不大时,它只能达到std::numeric_limits<int>::max(),这就是(再次假设这里有共同的32位平台){{1然后在比较中将其提升为2147483647,但保留其值,该值始终小于long long int。永远增加BIGPRIME永远不会到达任何地方,一旦你在i,你输入UB land,因为有符号整数不包含在C ++中。你的代码可能在那里无限循环,或做一些事情,如记录max()作为有效因素,或让你怀孕。

您可以通过添加一些

轻松观察到
-1

进入if( 0 == (i%100000000)){ std::cout << i << std::endl; } 循环。