簡體   English   中英

大數的最大質數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM