我一直在努力为Project Euler得到问题3的答案,在那里我需要找到600851475143的最大素因子,但是我的程序被挂上了这个数字,而不是更小的(或者有时候更大)。我删除了程序更普遍的目的,即寻找素数因子分解,希望它能减少计算时间,并可能给我一个答案,但事实并非如此。之前,当程序从1开始而不是输入时,它给了我最低的素数,17,但仅此而已。现在它没有给我任何东西。`unsigned long long`太小而不能代表数字?
对于其他人来说,似乎有效的工作是增加数据类型的大小,并在变量末尾添加“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;
}
https://mattmccutchen.net/bigint/ –
在我的实现(GCC为x86_64的)'unsigned long类型long'可容纳值高达18446744073709551615,所以600851475143应适合舒适。你可以通过['std :: numeric_limits'](http://en.cppreference.com/w/cpp/types/numeric_limits/max)找到你的实现的限制。 – 5gon12eder
比较'int'和'unsigned long long'可能是个好主意。由于该程序正在探索数据类型容量的上限,所以这是一个非常糟糕的主意。你可以填充int的正数本质上小于一个无符号整数,很可能远远小于无符号长整数。通过使所有类型相匹配,你不会损失太多。 – user4581301