Maximum possible prime divisors that can exist in numbers having exactly N divisors
Given an integer N which denotes the number of divisors of any number, the task is to find the maximum prime divisors that are possible in number having N divisors.
Examples:
Input: N = 4
Output: 2
Input: N = 8
Output: 3
Naive Approach: In this approach, the idea is to generate all the numbers having exactly N divisors and check for the maximum number of prime divisors. Below are the steps:
- Define a function is_prime(num) that takes an integer as input and returns True if it is prime, and False otherwise.
- Check if the number is less than 2, in which case it is not prime.
- Use a loop to check if the number is divisible by any integer from 2 up to its square root.
- If it is divisible by any integer, return False.
- If the loop completes without finding a divisor, return True.
Implementation:
C++
#include <iostream>
#include <cmath>
bool isPrime( int num) {
if (num < 2) {
return false ;
}
for ( int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false ;
}
}
return true ;
}
int countPrimes( int num) {
int count = 0;
for ( int i = 2; i * i <= num; i++) {
if (num % i == 0) {
if (isPrime(i)) {
count++;
}
if (isPrime(num / i)) {
count++;
}
}
}
return count;
}
int maxPrimeDivisorsBruteForce( int n) {
int maxPrimes = 0;
int maxNum = 0;
for ( int num = 2; num < pow (10, n); num++) {
int divisors = 0;
for ( int i = 1; i <= num; i++) {
if (num % i == 0) {
divisors++;
}
}
if (divisors == n) {
int primeCount = countPrimes(num);
if (primeCount > maxPrimes) {
maxPrimes = primeCount;
maxNum = num;
}
}
}
return maxPrimes;
}
int main() {
int n = 4;
int result = maxPrimeDivisorsBruteForce(n);
std::cout << result << std::endl;
return 0;
}
|
Java
public class MaxPrimeDivisorsBruteForce {
static boolean isPrime( int num) {
if (num < 2 ) {
return false ;
}
for ( int i = 2 ; i * i <= num; i++) {
if (num % i == 0 ) {
return false ;
}
}
return true ;
}
static int countPrimes( int num) {
int count = 0 ;
for ( int i = 2 ; i * i <= num; i++) {
if (num % i == 0 ) {
if (isPrime(i)) {
count++;
}
if (isPrime(num / i)) {
count++;
}
}
}
return count;
}
static int maxPrimeDivisorsBruteForce( int n) {
int maxPrimes = 0 ;
int maxNum = 0 ;
for ( int num = 2 ; num < Math.pow( 10 , n); num++) {
int divisors = 0 ;
for ( int i = 1 ; i <= num; i++) {
if (num % i == 0 ) {
divisors++;
}
}
if (divisors == n) {
int primeCount = countPrimes(num);
if (primeCount > maxPrimes) {
maxPrimes = primeCount;
maxNum = num;
}
}
}
return maxPrimes;
}
public static void main(String[] args) {
int n = 4 ;
int result = maxPrimeDivisorsBruteForce(n);
System.out.println(result);
}
}
|
Python3
def is_prime(num):
if num < 2 :
return False
for i in range ( 2 , int (num * * 0.5 ) + 1 ):
if num % i = = 0 :
return False
return True
def count_primes(num):
count = 0
for i in range ( 2 , int (num * * 0.5 ) + 1 ):
if num % i = = 0 :
while num % i = = 0 :
num / / = i
count + = 1
if num > 1 :
count + = 1
return count
def max_prime_divisors_optimized(n):
max_primes = 0
max_num = 0
for num in range ( 2 , 10 * * n):
divisors = 0
if num % 2 = = 0 :
continue
for i in range ( 1 , int (num * * 0.5 ) + 1 ):
if num % i = = 0 :
divisors + = 1
if i ! = num / / i:
divisors + = 1
if divisors = = n:
prime_count = count_primes(num)
if prime_count > max_primes:
max_primes = prime_count
max_num = num
return max_primes
def main():
n = 4
result = max_prime_divisors_optimized(n)
print (result)
if __name__ = = "__main__" :
main()
|
C#
using System;
public class MaxPrimeDivisorsBruteForce
{
static bool IsPrime( int num)
{
if (num < 2)
{
return false ;
}
for ( int i = 2; i * i <= num; i++)
{
if (num % i == 0)
{
return false ;
}
}
return true ;
}
static int CountPrimes( int num)
{
int count = 0;
for ( int i = 2; i * i <= num; i++)
{
if (num % i == 0)
{
if (IsPrime(i))
{
count++;
}
if (IsPrime(num / i))
{
count++;
}
}
}
return count;
}
static int FindMaxPrimeDivisor( int n)
{
int maxPrimes = 0;
for ( int num = 2; num < Math.Pow(10, n); num++)
{
int divisors = 0;
for ( int i = 1; i <= num; i++)
{
if (num % i == 0)
{
divisors++;
}
}
if (divisors == n)
{
int primeCount = CountPrimes(num);
if (primeCount > maxPrimes)
{
maxPrimes = primeCount;
}
}
}
return maxPrimes;
}
public static void Main( string [] args)
{
int n = 4;
int result = FindMaxPrimeDivisor(n);
Console.WriteLine(result);
}
}
|
Javascript
function isPrime(num) {
if (num < 2) {
return false ;
}
for (let i = 2; i * i <= num; i++) {
if (num % i === 0) {
return false ;
}
}
return true ;
}
function countPrimes(num) {
let count = 0;
for (let i = 2; i * i <= num; i++) {
if (num % i === 0) {
if (isPrime(i)) {
count++;
}
if (isPrime(num / i)) {
count++;
}
}
}
return count;
}
function maxPrimeDivisorsBruteForce(n) {
let maxPrimes = 0;
let maxNum = 0;
for (let num = 2; num < Math.pow(10, n); num++) {
let divisors = 0;
for (let i = 1; i <= num; i++) {
if (num % i === 0) {
divisors++;
}
}
if (divisors === n) {
let primeCount = countPrimes(num);
if (primeCount > maxPrimes) {
maxPrimes = primeCount;
maxNum = num;
}
}
}
return maxPrimes;
}
const n = 4;
const result = maxPrimeDivisorsBruteForce(n);
console.log(result);
|
Time Complexity: O(N2 * log(N))
Space Complexity: O(N)
Approach: The idea is to find the prime factorization of the number N, then the sum of the powers of the prime divisors is the maximum possible prime divisors of a number can have with N divisors.
For Example:
Let the number of divisors of number be 4,
Then the possible numbers can be 6, 10, 15,...
Divisors of 6 = 1, 2, 3, 6
Total number of prime-divisors = 2 (2, 3)
Prime Factorization of 4 = 22
Sum of powers of prime factors = 2
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
#define ll long long int
void findMaxPrimeDivisor( int n){
int max_possible_prime = 0;
while (n % 2 == 0) {
max_possible_prime++;
n = n / 2;
}
for ( int i = 3; i * i <= n; i = i + 2) {
while (n % i == 0) {
max_possible_prime++;
n = n / i;
}
}
if (n > 2) {
max_possible_prime++;
}
cout << max_possible_prime << "\n" ;
}
int main()
{
int n = 4;
findMaxPrimeDivisor(n);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void findMaxPrimeDivisor( int n)
{
int max_possible_prime = 0 ;
while (n % 2 == 0 )
{
max_possible_prime++;
n = n / 2 ;
}
for ( int i = 3 ; i * i <= n; i = i + 2 )
{
while (n % i == 0 )
{
max_possible_prime++;
n = n / i;
}
}
if (n > 2 )
{
max_possible_prime++;
}
System.out.print(max_possible_prime + "\n" );
}
public static void main(String[] args)
{
int n = 4 ;
findMaxPrimeDivisor(n);
}
}
|
Python3
def findMaxPrimeDivisor(n):
max_possible_prime = 0
while (n % 2 = = 0 ):
max_possible_prime + = 1
n = n / / 2
i = 3
while (i * i < = n):
while (n % i = = 0 ):
max_possible_prime + = 1
n = n / / i
i = i + 2
if (n > 2 ):
max_possible_prime + = 1
print (max_possible_prime)
n = 4
findMaxPrimeDivisor(n)
|
C#
using System;
class GFG{
static void findMaxPrimeDivisor( int n)
{
int max_possible_prime = 0;
while (n % 2 == 0)
{
max_possible_prime++;
n = n / 2;
}
for ( int i = 3; i * i <= n; i = i + 2)
{
while (n % i == 0)
{
max_possible_prime++;
n = n / i;
}
}
if (n > 2)
{
max_possible_prime++;
}
Console.Write(max_possible_prime + "\n" );
}
public static void Main(String[] args)
{
int n = 4;
findMaxPrimeDivisor(n);
}
}
|
Javascript
<script>
function findMaxPrimeDivisor(n)
{
let max_possible_prime = 0;
while (n % 2 == 0)
{
max_possible_prime++;
n = Math.floor(n / 2);
}
for (let i = 3; i * i <= n; i = i + 2)
{
while (n % i == 0)
{
max_possible_prime++;
n = Math.floor(n / i);
}
}
if (n > 2)
{
max_possible_prime++;
}
document.write(max_possible_prime + "\n" );
}
let n = 4;
findMaxPrimeDivisor(n);
</script>
|
Time Complexity: O(sqrt(N) * logN )
Auxiliary Space: O(1)
Last Updated :
09 Nov, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...