📜  检查数字是否恰好具有三个截然不同的因素

📅  最后修改于: 2021-04-29 01:02:17             🧑  作者: Mango

给定正整数n(1 <= n <= 10 18 )。检查数字是否恰好具有三个截然不同的因素。打印“”,如果有,否则““。

例子 :

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

Input  : 10
Output : No

一种简单的方法是通过使用此方法生成一个数的所有除数来对因数进行计数,然后检查所有因数的计数是否等于“ 3”。此方法的时间复杂度为O(sqrt(n))。

更好的方法是使用数论。根据理想平方的性质,“每个理想平方(x 2 )总是只有奇数个因数”。

如果给定数字的平方根(例如x 2 )是质数(在使该数字为完美平方之后),则它必须具有三个完全不同的因子,即

  1. 当然是1号。
  2. 数字的平方根,即x (质数)。
  3. 数字本身,即x 2

下面是上述方法的实现:

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


Javascript


输出 :

Yes
No
No

时间复杂度: O(n 1/4 )
辅助空间: O(1)