我有这个简单的程序:
// 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
。
答案 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 % 1
是0
),因此您将num
除以1
,这会导致num
重新进入for循环,它一次又一次地做同样的事。
此修复(在i
循环中初始化2
),内部for循环很可能是无限循环和/或导致UB。否则(正如其他人所述)它“只是”运行很长时间。对于不同的情况(假设这里最常见的平台)。这取决于您尝试计算的值,如果第一个因子小于std::numeric_limits<int>::max()
,那么这不适用。让我们调用那些素数BIGPRIME
(600851475149
就是一个很好的例子。)
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; }
循环。