给定数字n,找到两对可以将数字表示为两个多维数据集之和的对。换句话说,找到两对(a,b)和(c,d),使得给定数n可以表示为
n = a^3 + b^3 = c^3 + d^3
其中a,b,c和d是四个不同的数字。
例子:
Input: n = 1729
Output: (1, 12) and (9, 10)
Explanation:
1729 = 1^3 + 12^3 = 9^3 + 10^3
Input: n = 4104
Output: (2, 16) and (9, 15)
Explanation:
4104 = 2^3 + 16^3 = 9^3 + 15^3
Input: n = 13832
Output: (2, 24) and (18, 20)
Explanation:
13832 = 2^3 + 24^3 = 18^3 + 20^3
我们在下面的集合1中讨论了O( n 2/3 )解。
查找立方体对|集合1(A n ^(2/3)解)
在这篇文章中,讨论了O( n 1/3 )解。
满足约束的任何数字n都将具有两个不同的对(a,b)和(c,d),使得a,b,c和d都小于n 1/3 。这个想法是创建一个大小为n 1/3的辅助数组。数组中的每个索引i将存储等于该索引的立方的值,即arr [i] = i ^ 3。现在问题减少到在有序数组中找到总和等于给定数n的元素对。在此详细讨论该问题。
下面是上述想法的实现:
C++
// C++ program to find pairs that can represent
// the given number as sum of two cubes
#include
#include
using namespace std;
// Function to find pairs that can represent
// the given number as sum of two cubes
void findPairs(int n)
{
// find cube root of n
int cubeRoot = pow(n, 1.0 / 3.0);
// create a array of size of size 'cubeRoot'
int cube[cubeRoot + 1];
// for index i, cube[i] will contain i^3
for (int i = 1; i <= cubeRoot; i++)
cube[i] = i*i*i;
// Find all pairs in above sorted
// array cube[] whose sum is equal to n
int l = 1;
int r = cubeRoot;
while (l < r)
{
if (cube[l] + cube[r] < n)
l++;
else if(cube[l] + cube[r] > n)
r--;
else {
cout << "(" << l << ", " << r
<< ")" << endl;
l++; r--;
}
}
}
// Driver function
int main()
{
int n = 20683;
findPairs(n);
return 0;
}
Java
// Java program to find pairs
// that can represent the given
// number as sum of two cubes
import java.io.*;
class GFG
{
// Function to find pairs
// that can represent the
// given number as sum of
// two cubes
static void findPairs(int n)
{
// find cube root of n
int cubeRoot = (int)Math.pow(
n, 1.0 / 3.0);
// create a array of
// size of size 'cubeRoot'
int cube[] = new int[cubeRoot + 1];
// for index i, cube[i]
// will contain i^3
for (int i = 1; i <= cubeRoot; i++)
cube[i] = i * i * i;
// Find all pairs in above
// sorted array cube[]
// whose sum is equal to n
int l = 1;
int r = cubeRoot;
while (l < r)
{
if (cube[l] + cube[r] < n)
l++;
else if(cube[l] + cube[r] > n)
r--;
else {
System.out.println("(" + l +
", " + r +
")" );
l++; r--;
}
}
}
// Driver Code
public static void main (String[] args)
{
int n = 20683;
findPairs(n);
}
}
// This code is contributed by anuj_67.
Python3
# Python3 program to find pairs that
# can represent the given number
# as sum of two cubes
import math
# Function to find pairs that can
# represent the given number as
# sum of two cubes
def findPairs( n):
# find cube root of n
cubeRoot = int(math.pow(n, 1.0 / 3.0));
# create a array of
# size of size 'cubeRoot'
cube = [0] * (cubeRoot + 1);
# for index i, cube[i]
# will contain i^3
for i in range(1, cubeRoot + 1):
cube[i] = i * i * i;
# Find all pairs in above sorted
# array cube[] whose sum
# is equal to n
l = 1;
r = cubeRoot;
while (l < r):
if (cube[l] + cube[r] < n):
l += 1;
elif(cube[l] + cube[r] > n):
r -= 1;
else:
print("(" , l , ", " , math.floor(r),
")", end = "");
print();
l += 1;
r -= 1;
# Driver code
n = 20683;
findPairs(n);
# This code is contributed by mits
C#
// C# program to find pairs
// that can represent the given
// number as sum of two cubes
using System;
class GFG
{
// Function to find pairs
// that can represent the
// given number as sum of
// two cubes
static void findPairs(int n)
{
// find cube root of n
int cubeRoot = (int)Math.Pow(n, 1.0 /
3.0);
// create a array of
// size of size 'cubeRoot'
int []cube = new int[cubeRoot + 1];
// for index i, cube[i]
// will contain i^3
for (int i = 1; i <= cubeRoot; i++)
cube[i] = i * i * i;
// Find all pairs in above
// sorted array cube[]
// whose sum is equal to n
int l = 1;
int r = cubeRoot;
while (l < r)
{
if (cube[l] + cube[r] < n)
l++;
else if(cube[l] + cube[r] > n)
r--;
else {
Console.WriteLine("(" + l +
", " + r +
")" );
l++; r--;
}
}
}
// Driver Code
public static void Main ()
{
int n = 20683;
findPairs(n);
}
}
// This code is contributed by anuj_67.
PHP
$n)
$r--;
else
{
echo "(" , $l , ", " , floor($r)
, ")" ;
echo "\n";
$l++;$r--;
}
}
}
// Driver code
$n = 20683;
findPairs($n);
// This code is contributed by anuj_67.
?>
Javascript
输出:
(10, 27)
(19, 24)