Related Articles
Check whether a number has exactly three distinct factors or not
• Difficulty Level : Easy
• Last Updated : 09 Apr, 2021

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

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 using namespace std; // Utility function to check whether a// number is prime or notbool 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 notbool 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 programint 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 notpublic class GFG {  // Utility function to check whether a// number is prime or notstatic 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 notstatic 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 notdef 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 notdef 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 programif __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 contributd by# Surendra_Gangwar

## C#

 // C# program to check whether number// has exactly three distinct factors// or notusing 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



Output :

Yes
No
No

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

This article is contributed by Shubham Bansal. 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.-

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up