Check whether a number can be represented as difference of two consecutive cubes

• Last Updated : 31 Mar, 2021

Given a number N, the task is to check if the number N can be represented as the difference of two consecutive cubes or not. If Yes then print those numbers else print No.

Examples:

Input: N = 19
Output:
Yes
2 3
Explanation:
33 – 23 = 19

Input: N = 10
Output: No

Approach: The key observation in the problem is that a number can be represented as difference of two consecutive cubes if and only if:

=> N = (K+1)3 – K3
=> N = 3*K2 + 3*K + 1
=> 12*N = 36*K2 + 36*K + 12
=> 12*N = (6*K + 3)2 + 3
=> 12*N – 3 = (6*K + 3)2
which means (12*N – 3) must be a perfect square to break N into difference of two consecutive cubes.

Therefore, if the above condition holds true then we will print the numbers using a for a loop by check that for which value of i if (i+1)3 – i3 = N and print the number i and i + 1.

Below is the implementation of the above approach:

C++

 // C++ program for the above approach#include using namespace std; // Function to print the two consecutive// numbers whose difference is Nvoid print(int N){    // Iterate in the range [0, 10^5]    for (int i = 0; i < 100000; i++) {         if (pow(i + 1, 3)                - pow(i, 3)            == N) {             cout << i << ' ' << i + 1;            return;        }    }} // Function to check if N is a// perfect cubebool isPerfectSquare(long double x){    // Find floating point value of    // square root of x.    long double sr = sqrt(x);     // If square root is an integer    return ((sr - floor(sr)) == 0);} // Function to check whether a number// can be represented as difference// of two consecutive cubesbool diffCube(int N){    // Check if 12 * N - 3 is a    // perfect square or not    return isPerfectSquare(12 * N - 3);} // Driver Codeint main(){    // Given Number N    int N = 19;    if (diffCube(N)) {        cout << "Yes\n";        print(N);    }    else {        cout << "No\n";    }    return 0;}

Java

 // Java program for the above approachimport java.util.*;class GFG{   // Function to print the two consecutive// numbers whose difference is Nstatic void print(int N){    // Iterate in the range [0, 10^5]    for (int i = 0; i < 100000; i++)    {          if (Math.pow(i + 1, 3) - Math.pow(i, 3) == N)        {            int j = i + 1;            System.out.println(i + " " + j);            return;        }    }}  // Function to check if N is a// perfect cubestatic boolean isPerfectSquare(double x){    // Find floating point value of    // square root of x.    double sr = Math.sqrt(x);      // If square root is an integer    return ((sr - Math.floor(sr)) == 0);}  // Function to check whether a number// can be represented as difference// of two consecutive cubesstatic boolean diffCube(int N){    // Check if 12 * N - 3 is a    // perfect square or not    return isPerfectSquare(12 * N - 3);}  // Driver Codepublic static void main(String[] args){    // Given Number N    int N = 19;    if (diffCube(N))    {        System.out.println("Yes");        print(N);    }    else    {        System.out.println("No");    }}} // This code is contributed by rock_cool

Python3

 # Python3 program for the above approachimport math # Function to print the two consecutive# numbers whose difference is Ndef printt(N):         # Iterate in the range [0, 10^5]    for i in range(100000):        if (pow(i + 1, 3) - pow(i, 3) == N):            print(i, '', i + 1)            return         # Function to check if N is a# perfect cubedef isPerfectSquare(x):         # Find floating povalue of    # square root of x.    sr = math.sqrt(x)     # If square root is an integer    return ((sr - math.floor(sr)) == 0) # Function to check whether a number# can be represented as difference# of two consecutive cubesdef diffCube(N):         # Check if 12 * N - 3 is a    # perfect square or not    return isPerfectSquare(12 * N - 3) # Driver Code # Given number NN = 19 if (diffCube(N)):    print("Yes")    printt(N)     else:    print("No") # This code is contributed by sanjoy_62

C#

 // C# program for the above approachusing System;class GFG{   // Function to print the two consecutive// numbers whose difference is Nstatic void print(int N){    // Iterate in the range [0, 10^5]    for (int i = 0; i < 100000; i++)    {          if (Math.Pow(i + 1, 3) - Math.Pow(i, 3) == N)        {            int j = i + 1;            Console.WriteLine(i + " " + j);            return;        }    }}  // Function to check if N is a// perfect cubestatic bool isPerfectSquare(double x){    // Find floating point value of    // square root of x.    double sr = Math.Sqrt(x);      // If square root is an integer    return ((sr - Math.Floor(sr)) == 0);}  // Function to check whether a number// can be represented as difference// of two consecutive cubesstatic bool diffCube(int N){    // Check if 12 * N - 3 is a    // perfect square or not    return isPerfectSquare(12 * N - 3);}  // Driver Codepublic static void Main(String[] args){    // Given Number N    int N = 19;    if (diffCube(N))    {        Console.WriteLine("Yes");        print(N);    }    else    {        Console.WriteLine("No");    }}} // This code is contributed by Rajput-Ji

Javascript


Output:
Yes
2 3

Time Complexity: O(N), where N is in the range 105
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up