给定一个整数X ,任务是找到三个大于1的不同整数,即A , B和C ,使得(A * B * C)= X。如果不存在这样的三元组,则打印-1 。
例子:
Input: X = 64
Output: 2 4 8
(2 * 4 * 8) = 64
Input: X = 32
Output: -1
No such triplet exists.
方法:假设我们有一个三元组(A,B,C) 。注意,为了使它们的乘积等于X ,每个整数必须是X的因数。因此,使用本文讨论的方法,将所有X因子都存储在O(sqrt(X))时间中。
现在最多会有sqrt(X)个因素。接下来,通过运行两个循环,一个选择A ,另一个选择B ,对每个因子进行迭代。现在,如果该三元组有效,即C = X /(A * B) ,其中C也是X的因子。要检查这一点,请将所有因素存储在unordered_set中。如果找到有效的三元组,则打印三元组,否则打印-1 。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to find the required triplets
void findTriplets(int x)
{
// To store the factors
vector fact;
unordered_set factors;
// Find factors in sqrt(x) time
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
fact.push_back(i);
if (x / i != i)
fact.push_back(x / i);
factors.insert(i);
factors.insert(x / i);
}
}
bool found = false;
int k = fact.size();
for (int i = 0; i < k; i++) {
// Choose a factor
int a = fact[i];
for (int j = 0; j < k; j++) {
// Choose another factor
int b = fact[j];
// These conditions need to be
// met for a valid triplet
if ((a != b) && (x % (a * b) == 0)
&& (x / (a * b) != a)
&& (x / (a * b) != b)
&& (x / (a * b) != 1)) {
// Print the valid triplet
cout << a << " " << b << " "
<< (x / (a * b));
found = true;
break;
}
}
// Triplet found
if (found)
break;
}
// Triplet not found
if (!found)
cout << "-1";
}
// Driver code
int main()
{
int x = 105;
findTriplets(x);
return 0;
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
// Function to find the required triplets
static void findTriplets(int x)
{
// To store the factors
Vector fact = new Vector();
HashSet factors = new HashSet();
// Find factors in Math.sqrt(x) time
for (int i = 2; i <= Math.sqrt(x); i++)
{
if (x % i == 0)
{
fact.add(i);
if (x / i != i)
fact.add(x / i);
factors.add(i);
factors.add(x / i);
}
}
boolean found = false;
int k = fact.size();
for (int i = 0; i < k; i++)
{
// Choose a factor
int a = fact.get(i);
for (int j = 0; j < k; j++)
{
// Choose another factor
int b = fact.get(j);
// These conditions need to be
// met for a valid triplet
if ((a != b) && (x % (a * b) == 0)
&& (x / (a * b) != a)
&& (x / (a * b) != b)
&& (x / (a * b) != 1))
{
// Print the valid triplet
System.out.print(a+ " " + b + " "
+ (x / (a * b)));
found = true;
break;
}
}
// Triplet found
if (found)
break;
}
// Triplet not found
if (!found)
System.out.print("-1");
}
// Driver code
public static void main(String[] args)
{
int x = 105;
findTriplets(x);
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 implementation of the approach
from math import sqrt
# Function to find the required triplets
def findTriplets(x) :
# To store the factors
fact = [];
factors = set();
# Find factors in sqrt(x) time
for i in range(2, int(sqrt(x))) :
if (x % i == 0) :
fact.append(i);
if (x / i != i) :
fact.append(x // i);
factors.add(i);
factors.add(x // i);
found = False;
k = len(fact);
for i in range(k) :
# Choose a factor
a = fact[i];
for j in range(k) :
# Choose another factor
b = fact[j];
# These conditions need to be
# met for a valid triplet
if ((a != b) and (x % (a * b) == 0)
and (x / (a * b) != a)
and (x / (a * b) != b)
and (x / (a * b) != 1)) :
# Print the valid triplet
print(a,b,x // (a * b));
found = True;
break;
# Triplet found
if (found) :
break;
# Triplet not found
if (not found) :
print("-1");
# Driver code
if __name__ == "__main__" :
x = 105;
findTriplets(x);
# This code is contributed by AnkitRai01
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
// Function to find the required triplets
static void findTriplets(int x)
{
// To store the factors
List fact = new List();
HashSet factors = new HashSet();
// Find factors in Math.Sqrt(x) time
for (int i = 2; i <= Math.Sqrt(x); i++)
{
if (x % i == 0)
{
fact.Add(i);
if (x / i != i)
fact.Add(x / i);
factors.Add(i);
factors.Add(x / i);
}
}
bool found = false;
int k = fact.Count;
for (int i = 0; i < k; i++)
{
// Choose a factor
int a = fact[i];
for (int j = 0; j < k; j++)
{
// Choose another factor
int b = fact[j];
// These conditions need to be
// met for a valid triplet
if ((a != b) && (x % (a * b) == 0)
&& (x / (a * b) != a)
&& (x / (a * b) != b)
&& (x / (a * b) != 1))
{
// Print the valid triplet
Console.Write(a+ " " + b + " "
+ (x / (a * b)));
found = true;
break;
}
}
// Triplet found
if (found)
break;
}
// Triplet not found
if (!found)
Console.Write("-1");
}
// Driver code
public static void Main(String[] args)
{
int x = 105;
findTriplets(x);
}
}
// This code is contributed by 29AjayKumar
输出:
3 5 7
时间复杂度: O(N),N = X
辅助空间: O(N)