给定数字N,请打印其所有唯一质数及其在N中的幂。
例子:
Input: N = 100
Output: Factor Power
2 2
5 2
Input: N = 35
Output: Factor Power
5 1
7 1
一个简单的解决方案是首先找到N的素因数。然后,对于每个素因数,找出将N除以并打印出来的最大幂。
一个有效的解决方案是使用Eratosthenes筛。
1) First compute an array s[N+1] using Sieve of Eratosthenes.
s[i] = Smallest prime factor of "i" that
divides "i".
For example let N = 10
s[2] = s[4] = s[6] = s[8] = s[10] = 2;
s[3] = s[9] = 3;
s[5] = 5;
s[7] = 7;
2) Using the above computed array s[],
we can find all powers in O(Log N) time.
curr = s[N]; // Current prime factor of N
cnt = 1; // Power of current prime factor
// Printing prime factors and their powers
while (N > 1)
{
N /= s[N];
// N is now N/s[N]. If new N also has its
// smallest prime factor as curr, increment
// power and continue
if (curr == s[N])
{
cnt++;
continue;
}
// Print prime factor and its power
print(curr, cnt);
// Update current prime factor as s[N] and
// initializing count as 1.
curr = s[N];
cnt = 1;
}
下面是上述步骤的实现。
C++
// C++ Program to print prime factors and their
// powers using Sieve Of Eratosthenes
#include
using namespace std;
// Using SieveOfEratosthenes to find smallest prime
// factor of all the numbers.
// For example, if N is 10,
// s[2] = s[4] = s[6] = s[10] = 2
// s[3] = s[9] = 3
// s[5] = 5
// s[7] = 7
void sieveOfEratosthenes(int N, int s[])
{
// Create a boolean array "prime[0..n]" and
// initialize all entries in it as false.
vector prime(N+1, false);
// Initializing smallest factor equal to 2
// for all the even numbers
for (int i=2; i<=N; i+=2)
s[i] = 2;
// For odd numbers less then equal to n
for (int i=3; i<=N; i+=2)
{
if (prime[i] == false)
{
// s(i) for a prime is the number itself
s[i] = i;
// For all multiples of current prime number
for (int j=i; j*i<=N; j+=2)
{
if (prime[i*j] == false)
{
prime[i*j] = true;
// i is the smallest prime factor for
// number "i*j".
s[i*j] = i;
}
}
}
}
}
// Function to generate prime factors and its power
void generatePrimeFactors(int N)
{
// s[i] is going to store smallest prime factor
// of i.
int s[N+1];
// Filling values in s[] using sieve
sieveOfEratosthenes(N, s);
printf("Factor Power\n");
int curr = s[N]; // Current prime factor of N
int cnt = 1; // Power of current prime factor
// Printing prime factors and their powers
while (N > 1)
{
N /= s[N];
// N is now N/s[N]. If new N als has smallest
// prime factor as curr, increment power
if (curr == s[N])
{
cnt++;
continue;
}
printf("%d\t%d\n", curr, cnt);
// Update current prime factor as s[N] and
// initializing count as 1.
curr = s[N];
cnt = 1;
}
}
//Driver Program
int main()
{
int N = 360;
generatePrimeFactors(N);
return 0;
}
Java
// Java Program to print prime
// factors and their powers using
// Sieve Of Eratosthenes
class GFG
{
// Using SieveOfEratosthenes
// to find smallest prime
// factor of all the numbers.
// For example, if N is 10,
// s[2] = s[4] = s[6] = s[10] = 2
// s[3] = s[9] = 3
// s[5] = 5
// s[7] = 7
static void sieveOfEratosthenes(int N,
int s[])
{
// Create a boolean array
// "prime[0..n]" and initialize
// all entries in it as false.
boolean[] prime = new boolean[N + 1];
// Initializing smallest
// factor equal to 2
// for all the even numbers
for (int i = 2; i <= N; i += 2)
s[i] = 2;
// For odd numbers less
// then equal to n
for (int i = 3; i <= N; i += 2)
{
if (prime[i] == false)
{
// s(i) for a prime is
// the number itself
s[i] = i;
// For all multiples of
// current prime number
for (int j = i; j * i <= N; j += 2)
{
if (prime[i * j] == false)
{
prime[i * j] = true;
// i is the smallest prime
// factor for number "i*j".
s[i * j] = i;
}
}
}
}
}
// Function to generate prime
// factors and its power
static void generatePrimeFactors(int N)
{
// s[i] is going to store
// smallest prime factor of i.
int[] s = new int[N + 1];
// Filling values in s[] using sieve
sieveOfEratosthenes(N, s);
System.out.println("Factor Power");
int curr = s[N]; // Current prime factor of N
int cnt = 1; // Power of current prime factor
// Printing prime factors
// and their powers
while (N > 1)
{
N /= s[N];
// N is now N/s[N]. If new N
// also has smallest prime
// factor as curr, increment power
if (curr == s[N])
{
cnt++;
continue;
}
System.out.println(curr + "\t" + cnt);
// Update current prime factor
// as s[N] and initializing
// count as 1.
curr = s[N];
cnt = 1;
}
}
// Driver Code
public static void main(String[] args)
{
int N = 360;
generatePrimeFactors(N);
}
}
// This code is contributed by mits
Python3
# Python3 program to print prime
# factors and their powers
# using Sieve Of Eratosthenes
# Using SieveOfEratosthenes to
# find smallest prime factor
# of all the numbers.
# For example, if N is 10,
# s[2] = s[4] = s[6] = s[10] = 2
# s[3] = s[9] = 3
# s[5] = 5
# s[7] = 7
def sieveOfEratosthenes(N, s):
# Create a boolean array
# "prime[0..n]" and initialize
# all entries in it as false.
prime = [False] * (N+1)
# Initializing smallest factor
# equal to 2 for all the even
# numbers
for i in range(2, N+1, 2):
s[i] = 2
# For odd numbers less then
# equal to n
for i in range(3, N+1, 2):
if (prime[i] == False):
# s(i) for a prime is
# the number itself
s[i] = i
# For all multiples of
# current prime number
for j in range(i, int(N / i) + 1, 2):
if (prime[i*j] == False):
prime[i*j] = True
# i is the smallest
# prime factor for
# number "i*j".
s[i * j] = i
# Function to generate prime
# factors and its power
def generatePrimeFactors(N):
# s[i] is going to store
# smallest prime factor
# of i.
s = [0] * (N+1)
# Filling values in s[]
# using sieve
sieveOfEratosthenes(N, s)
print("Factor Power")
# Current prime factor of N
curr = s[N]
# Power of current prime factor
cnt = 1
# Printing prime factors and
#their powers
while (N > 1):
N //= s[N]
# N is now N/s[N]. If new N
# als has smallest prime
# factor as curr, increment
# power
if (curr == s[N]):
cnt += 1
continue
print(str(curr) + "\t" + str(cnt))
# Update current prime factor
# as s[N] and initializing
# count as 1.
curr = s[N]
cnt = 1
#Driver Program
N = 360
generatePrimeFactors(N)
# This code is contributed by Ansu Kumari
C#
// C# Program to print prime
// factors and their powers using
// Sieve Of Eratosthenes
class GFG
{
// Using SieveOfEratosthenes
// to find smallest prime
// factor of all the numbers.
// For example, if N is 10,
// s[2] = s[4] = s[6] = s[10] = 2
// s[3] = s[9] = 3
// s[5] = 5
// s[7] = 7
static void sieveOfEratosthenes(int N, int[] s)
{
// Create a boolean array
// "prime[0..n]" and initialize
// all entries in it as false.
bool[] prime = new bool[N + 1];
// Initializing smallest
// factor equal to 2
// for all the even numbers
for (int i = 2; i <= N; i += 2)
s[i] = 2;
// For odd numbers less
// then equal to n
for (int i = 3; i <= N; i += 2)
{
if (prime[i] == false)
{
// s(i) for a prime is
// the number itself
s[i] = i;
// For all multiples of
// current prime number
for (int j = i; j * i <= N; j += 2)
{
if (prime[i * j] == false)
{
prime[i * j] = true;
// i is the smallest prime
// factor for number "i*j".
s[i * j] = i;
}
}
}
}
}
// Function to generate prime
// factors and its power
static void generatePrimeFactors(int N)
{
// s[i] is going to store
// smallest prime factor of i.
int[] s = new int[N + 1];
// Filling values in s[] using sieve
sieveOfEratosthenes(N, s);
System.Console.WriteLine("Factor Power");
int curr = s[N]; // Current prime factor of N
int cnt = 1; // Power of current prime factor
// Printing prime factors
// and their powers
while (N > 1)
{
N /= s[N];
// N is now N/s[N]. If new N
// also has smallest prime
// factor as curr, increment power
if (curr == s[N])
{
cnt++;
continue;
}
System.Console.WriteLine(curr + "\t" + cnt);
// Update current prime factor
// as s[N] and initializing
// count as 1.
curr = s[N];
cnt = 1;
}
}
// Driver Code
static void Main()
{
int N = 360;
generatePrimeFactors(N);
}
}
// This code is contributed by mits
PHP
1)
{
if($s[$N])
$N = (int)($N / $s[$N]);
// N is now N/s[N]. If new N als has smallest
// prime factor as curr, increment power
if ($curr == $s[$N])
{
$cnt++;
continue;
}
print($curr . "\t" . $cnt . "\n");
// Update current prime factor as s[N]
// and initializing count as 1.
$curr = $s[$N];
$cnt = 1;
}
}
// Driver Code
$N = 360;
generatePrimeFactors($N);
// This code is contributed by mits
?>
输出:
Factor Power
2 3
3 2
5 1
填充s []后,上述算法会找到O(Log N)时间的所有幂。这在竞争环境中非常有用,在竞争环境中我们有一个上限,我们需要为许多测试用例计算素因及其功效。在这种情况下,仅需对s []填充一次数组。