【发布时间】:2015-06-21 02:43:39
【问题描述】:
我一直在尝试为 Project Euler 找到问题 3 的答案,我需要在其中找到最大的质因数 600851475143,但我的程序挂断了这个数字,而不是更小的数字(或有时更大的数字)。我删除了程序寻找素数分解的更通用目的,希望它可以减少计算时间并可能给我一个答案,但它没有。以前,当程序从 1 而不是输入开始时,它给了我最低的质数,17,但仅此而已。现在它什么也没给我。
对于其他人来说,似乎可行的是增加数据类型的大小并将“ULL”附加到变量的末尾。这对我不起作用。其他人建议创建一个大数字类,但我还没有足够的知识来做到这一点,或者根本无法使用类,真的。这是程序。
#include <iostream>
using namespace std;
bool is_prime(unsigned long long int input);
void factor_number(unsigned long long int input);
int main()
{
unsigned long long int input = 600851475143ULL;
cout << "Hello World!\n\n";
if (is_prime(input) == false)
factor_number(input);
else
cout << input << 1;
cin.get();
return 0;
}
bool is_prime(unsigned long long int input)
{
for (int i = 1; i <= input; i++)
{
if (i != 1 && i != input)
{
if (input % i == 0)
{
return false;
}
}
else if (i == input)
return true;
}
}
void factor_number(unsigned long long int input)
{
unsigned long long int i = input;
while (input % i != 0 || is_prime(i) == false)
{
i--;
}
cout << i << endl;
}
【问题讨论】:
-
在我的实现(x86_64 的 GCC)
unsigned long long可以容纳高达 18446744073709551615 的值,因此 600851475143 应该很适合。您可以通过std::numeric_limits了解您的实施限制。 -
比较
int与unsigned long long可能是个坏主意。由于该程序正在探索数据类型容量的上限,因此这是一个非常糟糕的主意。您可以在 int 中填充的正数本质上小于 unsigned int,而且很可能远远小于 unsigned long long。通过使所有类型都匹配,您不会损失太多。
标签: c++