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循环只会执行一次,因为break它只会执行一次num /= 1。这意味着num永远不会减少,因此num > 1永远不会是错误的。我想你只需要等待更长的时间!

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

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

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

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

于 2012-12-20T15:23:23.287 回答
1

您是否尝试过从 2 开始您的 for 条件?如果从 1 开始,模块功能没有意义。

如果 (!(num % i))

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

于 2012-12-20T15:29:12.243 回答
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 位平台)2147483647,而后者又在比较中得到提升long long int但保持其价值,它总是小于BIGPRIME。总是增加i永远不会到达任何地方,一旦你max()进入 UB 土地,因为有符号整数不会在 C++ 中包装。你的代码可能会在那里无限循环,或者做一些事情,比如记录-1为有效因素,或者让你怀孕。

您可以通过添加一些轻松观察到

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

进入for循环。

于 2012-12-20T15:34:07.723 回答