Open In App

Check whether a number has exactly three distinct factors or not

Improve
Improve
Like Article
Like
Save
Share
Report

Given a positive integer n(1 <= n <= 1018). Check whether a number has exactly three distinct factors or not. Print “Yes” if it has otherwise “No“.

Examples : 

Input : 9
Output: Yes
Explanation
Number 9 has exactly three factors:
1, 3, 9, hence answer is 'Yes'
Input : 10
Output : No

Recommended Practice

Simple approach is to count factors by generating all divisors of a number by using this approach, after that check whether the count of all factors are equal to ‘3’ or not. Time complexity of this approach is O(sqrt(n)). 

Better approach is to use Number theory. According to property of perfect square, “Every perfect square(x2) always have only odd numbers of factors“. 

If the square root of given number(say x2) is prime(after conforming that number is perfect square) then it must have exactly three distinct factors i.e., 

  1. A number 1 of course.
  2. Square root of a number i.e., x(prime number).
  3. Number itself i.e., x2.

Below is the implementation of above approach: 

C++




// C++ program to check whether number
// has exactly three distinct factors
// or not
#include <bits/stdc++.h>
using namespace std;
 
// Utility function to check whether a
// number is prime or not
bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n % 2 == 0 || n % 3 == 0)
        return false;
 
    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to check whether given number
// has three distinct factors or not
bool isThreeDisctFactors(long long n)
{
    // Find square root of number
    int sq = (int)sqrt(n);
 
    // Check whether number is perfect
    // square or not
    if (1LL * sq * sq != n)
        return false;
 
    // If number is perfect square, check
    // whether square root is prime or
    // not
    return isPrime(sq) ? true : false;
}
 
// Driver program
int main()
{
    long long num = 9;
    if (isThreeDisctFactors(num))
        cout << "Yes\n";
    else
        cout << "No\n";
 
    num = 15;
    if (isThreeDisctFactors(num))
        cout << "Yes\n";
    else
        cout << "No\n";
 
    num = 12397923568441;
    if (isThreeDisctFactors(num))
        cout << "Yes\n";
    else
        cout << "No\n";
 
    return 0;
}


Java




// Java program to check whether number
// has exactly three distinct factors
// or not
public class GFG {
 
 
// Utility function to check whether a
// number is prime or not
static boolean isPrime(int n)
{
    // Corner cases
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n % 2 == 0 || n % 3 == 0)
        return false;
 
    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to check whether given number
// has three distinct factors or not
static boolean isThreeDisctFactors(long n)
{
    // Find square root of number
    int sq = (int)Math.sqrt(n);
 
    // Check whether number is perfect
    // square or not
    if (1L * sq * sq != n)
        return false;
 
    // If number is perfect square, check
    // whether square root is prime or
    // not
    return isPrime(sq) ? true : false;
}
 
// Driver program
    public static void main(String[] args) {
        long num = 9;
    if (isThreeDisctFactors(num))
        System.out.println("Yes");
    else
        System.out.println("No");
 
    num = 15;
    if (isThreeDisctFactors(num))
        System.out.println("Yes");
    else
        System.out.println("No");
 
    num = 12397923568441L;
    if (isThreeDisctFactors(num))
        System.out.println("Yes");
    else
        System.out.println("No");
    }
}


Python3




# Python 3 program to check whether number
# has exactly three distinct factors
# or not
 
from math import sqrt
# Utility function to check whether a
# number is prime or not
def isPrime(n):
    # Corner cases
    if (n <= 1):
        return False
    if (n <= 3):
        return True
 
    # This is checked so that we can skip
    # middle five numbers in below loop
    if (n % 2 == 0 or n % 3 == 0):
        return False
     
    k= int(sqrt(n))+1
    for i in range(5,k,6):
        if (n % i == 0 or n % (i + 2) == 0):
            return False
 
    return True
 
# Function to check whether given number
# has three distinct factors or not
def isThreeDisctFactors(n):
    # Find square root of number
    sq = int(sqrt(n))
 
    # Check whether number is perfect
    # square or not
    if (1 * sq * sq != n):
        return False
 
    # If number is perfect square, check
    # whether square root is prime or
    # not
    if (isPrime(sq)):
        return True
    else:
        return False
 
# Driver program
if __name__ == '__main__':
    num = 9
    if (isThreeDisctFactors(num)):
        print("Yes")
    else:
        print("No")
 
    num = 15
    if (isThreeDisctFactors(num)):
        print("Yes")
    else:
        print("No")
 
    num = 12397923568441
    if (isThreeDisctFactors(num)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by
# Surendra_Gangwar


C#




// C# program to check whether number
// has exactly three distinct factors
// or not
using System;
 
public class GFG {
 
    // Utility function to check whether
    // a number is prime or not
    static bool isPrime(int n)
    {
 
        // Corner cases
        if (n <= 1)
            return false;
        if (n <= 3)
            return true;
 
        // This is checked so that we can
        // skip middle five numbers in
        // below loop
        if (n % 2 == 0 || n % 3 == 0)
            return false;
 
        for (int i = 5; i * i <= n; i = i + 6)
            if (n % i == 0 || n % (i + 2) == 0)
                return false;
 
        return true;
    }
 
    // Function to check whether given number
    // has three distinct factors or not
    static bool isThreeDisctFactors(long n)
    {
 
        // Find square root of number
        int sq = (int)Math.Sqrt(n);
 
        // Check whether number is perfect
        // square or not
        if (1LL * sq * sq != n)
            return false;
 
        // If number is perfect square, check
        // whether square root is prime or
        // not
        return isPrime(sq) ? true : false;
    }
 
    // Driver program
    static public void Main()
    {
        long num = 9;
        if (isThreeDisctFactors(num))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
 
        num = 15;
        if (isThreeDisctFactors(num))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
 
        num = 12397923568441;
        if (isThreeDisctFactors(num))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This Code is contributed by vt_m.


Javascript




<script>
 
// Javascript program to check whether
// number has exactly three distinct
// factors or not
 
// Utility function to check whether a
// number is prime or not
function isPrime(n)
{
     
    // Corner cases
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    if (n % 2 == 0 || n % 3 == 0)
        return false;
 
    for(let i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to check whether given number
// has three distinct factors or not
function isThreeDisctFactors(n)
{
     
    // Find square root of number
    let sq = parseInt(Math.sqrt(n));
 
    // Check whether number is perfect
    // square or not
    if (sq * sq != n)
        return false;
 
    // If number is perfect square, check
    // whether square root is prime or
    // not
    return isPrime(sq) ? true : false;
}
 
// Driver code
let num = 9;
if (isThreeDisctFactors(num))
    document.write("Yes<br>");
else
    document.write("No<br>");
 
num = 15;
if (isThreeDisctFactors(num))
    document.write("Yes<br>");
else
    document.write("No<br>");
 
num = 12397923568441;
if (isThreeDisctFactors(num))
    document.write("Yes<br>");
else
    document.write("No<br>");
     
// This code is contributed by souravmahato348 
 
</script>


PHP




<?php
// PHP program to check whether
// number has exactly three
// distinct factors or not
 
// Utility function to check
// whether a number is prime
// or not
function isPrime($n)
{
    // Corner cases
    if ($n <= 1)
        return false;
    if ($n <= 3)
        return true;
 
    // This is checked so that
    // we can skip middle five
    // numbers in below loop
    if ($n % 2 == 0 || $n % 3 == 0)
        return false;
 
    for ($i = 5; $i * $i <= $n;
                   $i = $i + 6)
        if ($n % $i == 0 ||
            $n % ($i + 2) == 0)
            return false;
 
    return true;
}
 
// Function to check
// whether given number
// has three distinct
// factors or not
function isThreeDisctFactors($n)
{
    // Find square root of number
    $sq = sqrt($n);
 
    // Check whether number is
    // perfect square or not
    if ($sq * $sq != $n)
        return false;
 
    // If number is perfect square,
    // check whether square root is
    // prime or not
    return isPrime($sq) ? true : false;
}
 
// Driver Code
$num = 9;
if (isThreeDisctFactors($num))
    echo "Yes\n";
else
    echo "No\n";
 
$num = 15;
if (isThreeDisctFactors($num))
    echo "Yes\n";
else
    echo "No\n";
 
$num = 12397923568441;
if (isThreeDisctFactors($num))
    echo "Yes\n";
else
    echo "No\n";
 
// This code is contributed by ak_t
?>


Output : 

Yes
No
No

Time complexity : O(n1/4
Auxiliary space: O(1)


 

Using Brute Force Method in python:

Approach:

In this approach, we check all the numbers from 2 to the number itself. If the number of factors is exactly three, then the number has exactly three distinct factors.

Initialize a counter variable count to 0 to keep track of the number of factors of the given number.
Loop over all the numbers from 2 to n (inclusive) using the range function.
For each number i in the loop, check if n is divisible by i using the modulus operator %. If n is divisible by i, increment the count variable.
If the count variable is greater than 2, then the number n has more than three factors, so we return False.
After the loop, we check if the count variable is equal to 2. If yes, then the number n has exactly three distinct factors and we return True. Otherwise, the number n does not have exactly three distinct factors and we return False.

C++




#include <iostream>
using namespace std;
 
string hasExactlyThreeFactorsBrute(int n) {
    int count = 0;
    for (int i = 1; i <= n; i++) {
        if (n % i == 0) {
            count++;
        }
    }
    return (count == 3) ? "Yes" : "No";
}
 
int main() {
    cout << hasExactlyThreeFactorsBrute(9) << endl;
    cout << hasExactlyThreeFactorsBrute(10) << endl;
    return 0;
}


Java




public class GFG {
    public static String hasExactlyThreeFactorsBrute(int n) {
        int count = 0;
        for (int i = 1; i <= n; i++) {
            if (n % i == 0) {
                count++;
            }
        }
        return (count == 3) ? "Yes" : "No";
    }
 
    public static void main(String[] args) {
        System.out.println(hasExactlyThreeFactorsBrute(9));
        System.out.println(hasExactlyThreeFactorsBrute(10));
    }
}


Python3




def has_exactly_three_factors_brute(n):
    count = 0
    for i in range(1, n+1):
        if n % i == 0:
            count += 1
    if count == 3:
        return "Yes"
    else:
        return "No"
 
# example usage
print(has_exactly_three_factors_brute(9))
print(has_exactly_three_factors_brute(10))


C#




using System;
 
public class GFG
{
    public static string HasExactlyThreeFactorsBrute(int n)
    {
        int count = 0;
        for (int i = 1; i <= n; i++)
        {
            if (n % i == 0)
            {
                count++;
            }
        }
        return (count == 3) ? "Yes" : "No";
    }
 
    public static void Main(string[] args)
    {
        Console.WriteLine(HasExactlyThreeFactorsBrute(9));
        Console.WriteLine(HasExactlyThreeFactorsBrute(10));
    }
}


Javascript




function hasExactlyThreeFactorsBrute(n) {
    let count = 0;
    for (let i = 1; i <= n; i++) {
        if (n % i === 0) {
            count++;
        }
    }
    return (count === 3) ? "Yes" : "No";
}
 
console.log(hasExactlyThreeFactorsBrute(9));
console.log(hasExactlyThreeFactorsBrute(10));


Output

Yes
No


Time Complexity: O(n)
Space Complexity: O(1)



Last Updated : 21 Aug, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads