Open In App

Find numbers from 1 to N with exactly 3 divisors

Improve
Improve
Like Article
Like
Save
Share
Report

Given a number N, print all numbers in the range from 1 to N having exactly 3 divisors. 

Examples: 

Input: N = 16
Output: 4 9
Explanation: 4 and 9 have exactly three divisors.

Input: N = 49
Output: 4 9 25 49
Explanation: 4, 9, 25 and 49 have exactly three divisors.

Recommended Practice

Mathematical approach to find Numbers with exactly 3 divisors:

To solve the problem follow the below idea:

Idea: After having a close look at the examples mentioned above, you have noticed that all the required numbers are perfect squares and that too of only prime numbers. 

Proof: Suppose the number is N, and it is a perfect square with square root X such that X is prime.

Now if we find the factors of N, it will always have following combinations:

  • 1*N
  • X*X

Therefore the required numbers will have only three numbers as their divisors:

  • 1, 
  • that number itself, and 
  • just a single divisor in between 1 and the number.

Algorithm: We can generate all primes within a set using any sieve method efficiently and then we should take all primes i, such that i*i <=N

Follow the below steps to solve the problem:

  • Generate the prime numbers from 1 to N using any sieve method efficiently
  • Print all the prime numbers(X) between 1 to N, such as X2 is less than or equal to N

Below is the implementation of the above approach:

C++




// C++ program to print all
// three-primes smaller than
// or equal to N using Sieve
// of Eratosthenes
#include <bits/stdc++.h>
using namespace std;
 
// Generates all primes upto N and
// prints their squares
void numbersWith3Divisors(int N)
{
    bool prime[N + 1];
    memset(prime, true, sizeof(prime));
    prime[0] = prime[1] = 0;
 
    for (int p = 2; p * p <= N; p++) {
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p] == true) {
            // Update all multiples of p
            for (int i = p * 2; i <= N; i += p)
                prime[i] = false;
        }
    }
 
    // Print squares of primes upto n.
    cout << "Numbers with 3 divisors :\n";
    for (int i = 0; i * i <= N; i++)
        if (prime[i])
            cout << i * i << " ";
}
 
// Driver code
int main()
{
    int N = 96;
 
    // Function call
    numbersWith3Divisors(N);
 
    return 0;
}


Java




// Java program to print all
// three-primes smaller than
// or equal to N using Sieve
// of Eratosthenes
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Generates all primes upto N
    // and prints their squares
    static void numbersWith3Divisors(int N)
    {
        boolean[] prime = new boolean[N + 1];
        Arrays.fill(prime, true);
        prime[0] = prime[1] = false;
 
        for (int p = 2; p * p <= N; p++) {
 
            // If prime[p] is not changed,
            // then it is a prime
            if (prime[p] == true) {
                // Update all multiples of p
                for (int i = p * 2; i <= N; i += p)
                    prime[i] = false;
            }
        }
 
        // print squares of primes upto n
        System.out.println("Numbers with 3 divisors : ");
        for (int i = 0; i * i <= N; i++)
            if (prime[i])
                System.out.print(i * i + " ");
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int N = 96;
 
        // Function call
        numbersWith3Divisors(N);
    }
}
 
// Contributed by Pramod Kumar


Python3




# Python3 program to print
# all three-primes smaller than
# or equal to n using Sieve
# of Eratosthenes
 
# Generates all primes upto n
# and prints their squares
 
 
def numbersWith3Divisors(N):
 
    prime = [True]*(N+1)
    prime[0] = prime[1] = False
    p = 2
    while (p*p <= N):
 
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p] == True):
 
            # Update all multiples of p
            for i in range(p*2, N+1, p):
                prime[i] = False
        p += 1
 
    # print squares of primes upto n.
    print("Numbers with 3 divisors :")
    i = 0
    while (i*i <= N):
        if (prime[i]):
            print(i*i, end=" ")
        i += 1
 
 
# Driver code
if __name__ == "__main__":
    N = 96
 
    # Function call
    numbersWith3Divisors(N)
 
# This code is contributed by mits


C#




// C# program to print all
// three-primes smaller than
// or equal to n using Sieve
// of Eratosthenes
 
class GFG {
 
    // Generates all primes upto n
    // and prints their squares
    static void numbersWith3Divisors(int N)
    {
        bool[] prime = new bool[N + 1];
        prime[0] = prime[1] = true;
 
        for (int p = 2; p * p <= N; p++) {
 
            // If prime[p] is not changed,
            // then it is a prime
            if (prime[p] == false) {
                // Update all multiples of p
                for (int i = p * 2; i <= N; i += p)
                    prime[i] = true;
            }
        }
 
        // print squares of primes upto n
        System.Console.WriteLine(
            "Numbers with 3 divisors : ");
        for (int i = 0; i * i <= N; i++)
            if (!prime[i])
                System.Console.Write(i * i + " ");
    }
 
    // Driver code
    public static void Main()
    {
        int N = 96;
 
        // Function call
        numbersWith3Divisors(N);
    }
}
 
// This code is Contributed by mits


Javascript




// Javascript program to print all
    // three-primes smaller than
    // or equal to n using Sieve
    // of Eratosthenes
     
    // Generates all primes upto n and
    // prints their squares
    function numbersWith3Divisors(n)
    {
        let prime = new Array(n+1);
        prime.fill(true);
        prime[0] = prime[1] = 0;
 
        for (let p = 2; p*p <= n; p++)
        {
            // If prime[p] is not changed,
            // then it is a prime
            if (prime[p] == true)
            {
               // Update all multiples of p
               for (let i = p*2; i <= n; i += p)
                  prime[i] = false;
            }
        }
 
        // print squares of primes upto n.
        document.write("Numbers with 3 divisors :" + "</br>");
        for (let i = 0;  i*i <= n ; i++)
            if (prime[i])
              document.write(i*i + " ");
    }
 
    // sieve();
    let n = 96;
    numbersWith3Divisors(n);
     
     // This code is contributed by mukesh07.


PHP




<?php
// PHP program to print all three-primes
// smaller than or equal to n using Sieve
// of Eratosthenes
 
// Generates all primes upto n and
// prints their squares
function numbersWith3Divisors($N)
{
    $prime = array_fill(0, $N + 1, true);
    $prime[0] = $prime[1] = false;
 
    for ($p = 2; $p * $p <= $N; $p++)
    {
        // If prime[p] is not changed,
        // then it is a prime
        if ($prime[$p] == true)
        {
        // Update all multiples of p
        for ($i = $p * 2; $i <= $N; $i += $p)
            $prime[$i] = false;
        }
    }
 
    // print squares of primes upto n.
    echo "Numbers with 3 divisors :\n";
    for ($i = 0; $i * $i <= $N ; $i++)
        if ($prime[$i])
        echo $i * $i . " ";
}
 
// Driver Code
$N = 96;
 
// Function call
numbersWith3Divisors($N);
 
// This code is contributed by mits
?>


Output

Numbers with 3 divisors :
4 9 25 49 

Time Complexity: O(N*log(log(N)))
Auxiliary Space: O(N)

Numbers with exactly 3 divisors using constant space:

Run a loop from 2 to sqrt(N) and check if the current element is prime or not, if it is so then print that number, but this method will increase the time complexity of the solution

Follow the below steps to solve the problem:

  • Start a loop for integer i from 2 to N.
  • Check if i is prime or not, which can be done easily using the isPrime(n) method.
  • If i is prime, check if its square is less than or equal to the given number. This will be reviewed only for squares of prime numbers, therefore reducing the number of checks.
  • If the above condition is satisfied, the number will be printed and the loop will continue till i <= n.

Below is the implementation of the above approach:

C++




// C++ program to print all
// three-primes smaller than
// or equal to n without using
// extra space
#include <bits/stdc++.h>
using namespace std;
 
void numbersWith3Divisors(int);
bool isPrime(int);
 
// Generates all primes upto n and
// prints their squares
void numbersWith3Divisors(int N)
{
    cout << "Numbers with 3 divisors : " << endl;
 
    for (int i = 2; i * i <= N; i++) {
 
        // Check prime
        if (isPrime(i)) {
                // Print numbers in
                // the order of
                // occurrence
                cout << i * i << " ";
        }
    }
}
 
// Check if a number is prime or not
bool isPrime(int N)
{
    for (int i = 2; i * i <= N; i++) {
        if (N % i == 0)
            return false;
    }
    return true;
}
 
// Driver code
int main()
{
    int N = 122;
 
    // Function call
    numbersWith3Divisors(N);
 
    return 0;
}
 
// This code is contributed by vishu2908


Java




// Java program to print all
// three-primes smaller than
// or equal to N without using
// extra space
import java.util.*;
 
class GFG {
 
    // 3 divisor logic implementation
    // check if a number is
    // prime or not
    // if it is a prime then
    // check if its square
    // is less than or equal to
    // the given number
    static void numbersWith3Divisors(int N)
    {
        System.out.println("Numbers with 3 divisors : ");
 
        for (int i = 2; i * i <= N; i++) {
 
            // Check prime
            if (isPrime(i)) {
                    // Print numbers in
                    // the order of
                    // occurrence
                    System.out.print(i * i + " ");
            }
        }
    }
 
    // Check if a number is prime or not
    public static boolean isPrime(int N)
    {
        for (int i = 2; i * i <= N; i++) {
            if (N % i == 0)
                return false;
        }
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int N = 122;
 
        // Function call
        numbersWith3Divisors(N);
    }
}
 
// Contributed by Parag Pallav Singh


Python3




# Python3 program to print all
# three-primes smaller than
# or equal to N without using
# extra space
 
# 3 divisor logic implementation
# check if a number is  prime or
# not if it is a prime then check
# if its square is less than or
# equal to the given number
 
 
def numbersWith3Divisors(N):
 
    print("Numbers with 3 divisors : ")
 
    i = 2
    while i * i <= N:
 
        # Check prime
        if (isPrime(i)):
                # Print numbers in the order
                # of occurrence
                print(i * i, end=" ")
 
        i += 1
 
# Check if a number is prime or not
 
 
def isPrime(N):
 
    i = 2
    while i * i <= N:
        if N % i == 0:
            return False
 
        i += 1
 
    return True
 
 
# Driver code
if __name__ == "__main__":
    N = 122
 
    # Function call
    numbersWith3Divisors(N)
 
# This code is contributed by divyesh072019


C#




// C# program to print all
// three-primes smaller than
// or equal to N without using
// extra space
using System;
 
class GFG {
 
    // 3 divisor logic implementation
    // check if a number is prime or
    // not if it is a prime then check
    // if its square is less than or
    // equal to the given number
    static void numbersWith3Divisors(int N)
    {
        Console.WriteLine("Numbers with 3 divisors : ");
 
        for (int i = 2; i * i <= N; i++) {
 
            // Check prime
            if (isPrime(i)) {
                    // Print numbers in the order
                    // of occurrence
                    Console.Write(i * i + " ");
            }
        }
    }
 
    // Check if a number is prime or not
    public static bool isPrime(int N)
    {
        for (int i = 2; i * i <= N; i++) {
            if (N % i == 0)
                return false;
        }
        return true;
    }
 
    // Driver code
    static void Main()
    {
        int N = 122;
 
        // Function call
        numbersWith3Divisors(N);
    }
}
 
// This code is contributed by divyeshrabadiya07


Javascript




// Javascript program to print all
    // three-primes smaller than
    // or equal to n without using
    // extra space
     
      // 3 divisor logic implementation
    // check if a number is prime or
    // not if it is a prime then check
    // if its square is less than or
    // equal to the given number
    function numbersWith3Divisors(n)
    {
        document.write("Numbers with 3 divisors : ");
 
        for(let i = 2; i * i <= n; i++)
        {
 
            // Check prime
            if (isPrime(i))
            {
                    // Print numbers in the order
                    // of occurrence
                    document.write(i * i + " ");
            }
        }
    }
 
    // Check if a number is prime or not
    function isPrime(n)
    {
        if (n == 0 || n == 1)
            return false;
 
        for(let i = 2; i * i <= n; i++)
        {
            if (n % i == 0)
                return false;
        }
        return true;
    }
     
    let n = 122;
      
    numbersWith3Divisors(n);
 
// This code is contributed by suresh07.


Output

Numbers with 3 divisors : 
4 9 25 49 121 

Time Complexity: O(sqrt N2)
Auxiliary Space: O(1)




Last Updated : 02 Jan, 2024
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads