📜  查找立方体对|集合2(A n ^(1/3)解)

📅  最后修改于: 2021-04-27 23:27:05             🧑  作者: Mango

给定数字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)