Given a number N, the task is to find the number which is less than or equals to N whose product of prime factors is maximum.
Note: If there is more than one number whose maximum product is equal, then print the smallest number of them.
Examples:
Input: N = 12
Output: 11
Explanation:
Product of prime factor of all numbers before N:
2 = 2
3 = 3
4 = 2
5 = 5
6 = 2 * 3 = 6
7 = 7
8 = 2
9 = 3
10 = 2 * 5 = 10
11 = 11
12 = 2*3 = 6
The maximum of all the above is 11.
Input: N = 20
Output: 19
Approach: The idea is to use the concept of Sieve of Eratosthenes to find the product of all the prime factors of N numbers and then find the minimum number whose product of prime factors is maximum. Below are the steps:
- Create a list of numbers from 1 to N and initialise every value with 1.
- Let p = 2 which is the first prime number. Iterate from p, count up in increments of p and multiply by p at each index of the list. These indexes will be p(p+1), p(p+2), p(p+3), etc.
For Example:
If p is a prime number, then multiply with p at every index which is multiple of p. For p = 2, Multiply with 2 at index 2, 4, 6, 8, 10,..., till N.
- Repeat the above step for all the prime number till N.
- After finding the product of all prime factors till N, traverse the list of numbers and find the least number with maximum product.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to find the smallest number // having a maximum product of prime factors int maxPrimefactorNum( int N)
{ // Declare the array arr[]
int arr[N + 1];
// Initialise array with 1
for ( int i = 0; i < N + 1; i++)
arr[i] = 1;
// Iterate from [2, N]
for ( int i = 2; i <= N; i++) {
// If value at index i is 1,
// then i is prime and make
// update array at index for
// all multiples of i
if (arr[i] == 1) {
for ( int j = i; j <= N; j += i) {
arr[j] *= i;
}
}
}
// Initialise maxValue
int maxValue = 1;
// Find number having maximum product
// of prime factor <= N
for ( int i = 2; i <= N; i++) {
if (arr[i] > maxValue) {
maxValue = i;
}
}
// Find the maximum value
return maxValue;
} // Driven Code int main()
{ // Given Number
int N = 20;
// Function call
cout << maxPrimefactorNum(N);
return 0;
} |
// Java program for the above approach import java.util.*;
class GFG{
// Function to find the smallest number // having a maximum product of prime factors static int maxPrimefactorNum( int N)
{ // Declare the array arr[]
int []arr = new int [N + 1 ];
// Initialise array with 1
for ( int i = 0 ; i < N + 1 ; i++)
arr[i] = 1 ;
// Iterate from [2, N]
for ( int i = 2 ; i <= N; i++)
{
// If value at index i is 1,
// then i is prime and make
// update array at index for
// all multiples of i
if (arr[i] == 1 )
{
for ( int j = i; j <= N; j += i)
{
arr[j] *= i;
}
}
}
// Initialise maxValue
int maxValue = 1 ;
// Find number having maximum product
// of prime factor <= N
for ( int i = 2 ; i<= N; i++)
{
if (arr[i] > maxValue)
{
maxValue = i;
}
}
// Find the maximum value
return maxValue;
} // Driver Code public static void main(String[] args)
{ // Given number
int N = 20 ;
// Function call
System.out.print(maxPrimefactorNum(N));
} } // This code is contributed by Rohit_ranjan |
# Python3 program for the above approach # Function to find the smallest number # having a maximum product of prime factors def maxPrimefactorNum(N):
# Declare the list arr
arr = []
# Initialise list with 1
for i in range (N + 1 ):
arr.append( 1 )
# Iterate from [2, N]
for i in range ( 2 , N + 1 ):
# If value at index i is 1,
# then i is prime and make
# update list at index for
# all multiples of i
if (arr[i] = = 1 ) :
for j in range (i, N + 1 , i):
arr[j] * = i
# Initialise maxValue
maxValue = 1
# Find number having maximum product
# of prime factor <= N
for i in range ( 2 , N + 1 ):
if (arr[i] > maxValue):
maxValue = i
# Find the maximum value
return maxValue
# Driver Code # Given number N = 20 ;
# Function call print (maxPrimefactorNum(N))
# This code is contributed by yatinagg |
// C# program for the above approach using System;
class GFG{
// Function to find the smallest number // having a maximum product of prime factors static int maxPrimefactorNum( int N)
{ // Declare the array []arr
int []arr = new int [N + 1];
// Initialise array with 1
for ( int i = 0; i < N + 1; i++)
arr[i] = 1;
// Iterate from [2, N]
for ( int i = 2; i <= N; i++)
{
// If value at index i is 1,
// then i is prime and make
// update array at index for
// all multiples of i
if (arr[i] == 1)
{
for ( int j = i; j <= N; j += i)
{
arr[j] *= i;
}
}
}
// Initialise maxValue
int maxValue = 1;
// Find number having maximum product
// of prime factor <= N
for ( int i = 2; i<= N; i++)
{
if (arr[i] > maxValue)
{
maxValue = i;
}
}
// Find the maximum value
return maxValue;
} // Driver Code public static void Main(String[] args)
{ // Given number
int N = 20;
// Function call
Console.Write(maxPrimefactorNum(N));
} } // This code is contributed by 29AjayKumar |
<script> // javascript program for the above approach // Function to find the smallest number // having a maximum product of prime factors function maxPrimefactorNum( N)
{ // Declare the array arr[]
let arr=Array(N + 1).fill(1);
// Initialise array with 1
//for (int i = 0; i < N + 1; i++)
// arr[i] = 1;
// Iterate from [2, N]
for (let i = 2; i <= N; i++) {
// If value at index i is 1,
// then i is prime and make
// update array at index for
// all multiples of i
if (arr[i] == 1) {
for (let j = i; j <= N; j += i) {
arr[j] *= i;
}
}
}
// Initialise maxValue
let maxValue = 1;
// Find number having maximum product
// of prime factor <= N
for (let i = 2; i <= N; i++) {
if (arr[i] > maxValue) {
maxValue = i;
}
}
// Find the maximum value
return maxValue;
} // Driven Code // Given Number
let N = 20;
// Function call
document.write(maxPrimefactorNum(N));
// This code contributed by Rajput-Ji </script> |
19
Time Complexity: O(N2)
Auxiliary Space: O(N)