给定正整数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号。
- 数字的平方根,即x (质数)。
- 数字本身,即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)