📜  大量的主要因素

📅  最后修改于: 2021-05-07 00:37:55             🧑  作者: Mango

给定数字N,请打印所有主要因子及其功效。这里N <= 10 ^ 18

例子 :

Input : 250 
Output : 2  1
         5  3
Explanation: The prime factors of 250 are 2
and 5. 2 appears once in the prime factorization 
of and 5 is thrice in it. 

Input : 1000000000000000000
Output : 2  18
         5  18
Explanation: The prime factors of 1000000000000000000
are 2 and 5. The prime factor 2 appears 18 times in 
the prime factorization. 5 appears 18 times. 

我们不能对单个大数使用Sieve的实现,因为它需要成比例的空间。我们首先计算2是给定数的因数的次数,然后从3迭代到Sqrt(n)以得到素数除以特定次数的次数,该次数每次减少n / i。我们将数字n(要计算其素数因式分解)除以其相应的最小素数,直到n变为1。如果在n> 2的末尾,则表示其素数,因此我们打印该特定数。

C++
// CPP program to print prime factors and their
// powers.
#include 
using namespace std;
  
// function to calculate all the prime factors and 
// count of every prime factor
void factorize(long long n)
{
    int count = 0;
  
    // count the number of times 2 divides 
    while (!(n % 2)) {
        n >>= 1; // equivalent to n=n/2;
        count++;
    }
  
    // if 2 divides it
    if (count)
        cout << 2 << "  " << count << endl;
  
    // check for all the possible numbers that can 
    // divide it
    for (long long i = 3; i <= sqrt(n); i += 2) {
        count = 0;
        while (n % i == 0) {
            count++;
            n = n / i;
        }
        if (count)
            cout << i << "  " << count << endl;
    }
  
    // if n at the end is a prime number.
    if (n > 2)
        cout << n << "  " << 1 << endl;
}
  
// driver program to test the above function
int main()
{
    long long n = 1000000000000000000;
    factorize(n);
    return 0;
}


Java
//Java program to print prime 
// factors and their powers.
  
class GFG {
  
// function to calculate all the 
// prime factors and count of 
// every prime factor 
    static void factorize(long n) {
        int count = 0;
  
        // count the number of times 2 divides 
        while (!(n % 2 > 0)) {
            // equivalent to n=n/2; 
            n >>= 1;
  
            count++;
        }
  
        // if 2 divides it 
        if (count > 0) {
            System.out.println("2" + " " + count);
        }
  
        // check for all the possible 
        // numbers that can divide it 
        for (long i = 3; i <= (long) Math.sqrt(n); i += 2) {
            count = 0;
            while (n % i == 0) {
                count++;
                n = n / i;
            }
            if (count > 0) {
                System.out.println(i + " " + count);
            }
        }
  
        // if n at the end is a prime number. 
        if (n > 2) {
            System.out.println(n + " " + "1");
        }
    }
  
    public static void main(String[] args) {
        long n = 1000000000000000000L;
        factorize(n);
    }
}
  
/*This code is contributed by 29AjayKumar*/


Python3
# Python3 program to print prime factors 
# and their powers.
import math
  
# Function to calculate all the prime 
# factors and count of every prime factor
def factorize(n):
    count = 0;
  
    # count the number of 
    # times 2 divides 
    while ((n % 2 > 0) == False): 
          
        # equivalent to n = n / 2;
        n >>= 1; 
        count += 1;
  
    # if 2 divides it
    if (count > 0):
        print(2, count);
  
    # check for all the possible
    # numbers that can divide it
    for i in range(3, int(math.sqrt(n)) + 1):
        count = 0;
        while (n % i == 0): 
            count += 1;
            n = int(n / i);
        if (count > 0):
            print(i, count);
        i += 2;
  
    # if n at the end is a prime number.
    if (n > 2):
        print(n, 1);
  
# Driver Code
n = 1000000000000000000;
factorize(n);
  
# This code is contributed by mits


C#
// C# program to print prime 
// factors and their powers.
using System;
  
public class GFG
{
  
// function to calculate all the 
// prime factors and count of 
// every prime factor
static void factorize(long n)
{
    int count = 0;
  
    // count the number of times 2 divides 
    while (! (n % 2 > 0)) 
    {
        // equivalent to n=n/2;
        n >>= 1; 
          
        count++;
    }
  
    // if 2 divides it
    if (count > 0)
        Console.WriteLine("2" + " " +count);
  
    // check for all the possible
    // numbers that can divide it
    for (long i = 3; i <= (long)
         Math.Sqrt(n); i += 2) 
    {
        count = 0;
        while (n % i == 0) {
            count++;
            n = n / i;
        }
        if (count > 0)
            Console.WriteLine(i + " " + count);
    }
  
    // if n at the end is a prime number.
    if (n > 2)
        Console.WriteLine(n +" " + "1" );
}
  
    // Driver Code
    static public void Main ()
    {
        long n = 1000000000000000000;
        factorize(n);
          
    }
}
  
// This code is contributed by vt_m.


PHP
>= 1; 
        $count++;
    }
  
    // if 2 divides it
    if ($count)
        echo(2 . " " . $count . "\n");
  
    // check for all the possible
    // numbers that can divide it
    for ($i = 3; $i <= sqrt($n); $i += 2)
    {
        $count = 0;
        while ($n % $i == 0) 
        {
            $count++;
            $n = $n / $i;
        }
        if ($count)
            echo($i . " " . $count);
    }
  
    // if n at the end is a prime number.
    if ($n > 2)
        echo($n . " " . 1);
}
  
// Driver Code
$n = 1000000000000000000;
factorize($n);
  
// This code is contributed by Ajit.
?>


输出 :

2 18
5 18

时间复杂度: O(sqrt(n))。