我一直在努力爲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