# Number less than equals to N with maximum product of prime factors

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 Seive 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:

1. Create a list of numbers from 1 to N and initialise every value with 1.
2. 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.

```
3. Repeat the above step for all the prime number till N.
4. 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   ` `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 `

Output:
```19
```

Time Complexity: O(N2)
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :