# Check whether a number has exactly three distinct factors or not

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: Please try your approach on {IDE} first, before moving on to the solution.

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 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 contributd 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. `

## PHP

 ` `

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 DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Article Tags :

4

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.