[英]Largest Prime Number with big numbers
我做了一個 Project Euler 問題 -這里
我已經無計可施了。 我得到了錯誤的解決方案。 我對“為什么”感到困惑,尤其是這段代碼不起作用。
相關 - 這個
這是我生成的答案。
long long x; // The max prime factor
long long n; // The number to be factored
while (n % 2 == 0)
{
n /= 2;
}
x = 2;
while (n % 3 == 0)
{
n /= 3;
}
x = 3;
for (int i = 5; i <= sqrt(n); i += 2)
{
while (n % i == 0)
{
n /= i;
}
x = i;
}
std::cout << x;
n = 600851475143 answer = 6857>! I am getting x = 1471
至少這個for循環
for (int i = 5; i <= sqrt(n); i += 2)
{
while (n % i == 0)
{
n /= i;
}
x = i;
}
是錯誤的,變量x
獲取小於或等於sqrt( n )
的最后一個 i 的值。
考慮例如 n 等於 22。除以 2 后,您將得到 n 等於 11。
在這段代碼之后
while (n % 3 == 0)
{
n /= 3;
}
x = 3;
x
將等於3
並且 for 循環將由於其計算結果為 false 的條件而被跳過。
代碼可以通過以下方式查找示例
long long int n = 600851475143;
long long int prime_factor = 0;
if (n % 2 == 0)
{
prime_factor = 2;
while (n % 2 == 0 ) n /= 2;
}
for (long long int i = 3; i <= n / i; i += 2)
{
if (n % i == 0)
{
prime_factor = i;
while (n % i == 0) n /= i;
}
}
if (n != 1) prime_factor = n;
std::cout << "prime factor = " << prime_factor << '\n';
此外,您應該使用無符號類型unsigned long long int
而不是有符號類型long long int
。 否則,您將需要編寫考慮源編號符號的代碼。
您可以編寫一個單獨的 function 如下面的演示程序所示
#include <iostream>
unsigned long long max_prime_factor( unsigned long long int n )
{
unsigned long long int prime_factor = 0;
if (not ( n < 2 ))
{
if (n % 2 == 0)
{
prime_factor = 2;
while (n % 2 == 0) n /= 2;
}
for (unsigned long long int i = 3; i <= n / i; i += 2)
{
if (n % i == 0)
{
prime_factor = i;
while (n % i == 0) n /= i;
}
}
}
return n < 2 ? prime_factor : n;
}
int main()
{
for (unsigned int i = 0; i < 20; i++)
{
std::cout << i << " -> " << max_prime_factor( i ) << '\n';
}
}
程序 output 是
0 -> 0
1 -> 0
2 -> 2
3 -> 3
4 -> 2
5 -> 5
6 -> 3
7 -> 7
8 -> 2
9 -> 3
10 -> 5
11 -> 11
12 -> 3
13 -> 13
14 -> 7
15 -> 5
16 -> 2
17 -> 17
18 -> 3
19 -> 19
int main() {
long long x = 0; // The max prime factor
long long n = 600851475143; // The number to be factored
long long a = sqrt(n);
while (n % 2 == 0) {
n /= 2;
}
x = 2;
while (n % 3 == 0) {
n /= 3;
}
x = 3;
for (int i = 5; i <= a; i += 2) {
while (n % i == 0) {
n /= i;
x = i;
}
}
std::cout << x << std::endl;
}
在這里它起作用了,sqrt(n) 太快停止了 for 循環,所以我把它放在 long long 中,而 x = i; 在錯誤的地方
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.