Given a number N, the task is to check whether the given number N is a perfect cube or not.
Examples:
Input: N = 216
Output: Yes
Explanation:
As 216 = 6*6*6. Therefore the cube root of 216 is 6.
Input: N = 100
Output: No
Method 1: Naive Approach
The idea is to check for each number from 1 to N if the cube of any of these numbers equals N. If so, then that number is the cube root of N and the N is a perfect cube.
Below is the implementation of the above approach:
C++
.
#include <bits/stdc++.h>
using namespace std;
void perfectCube( int N)
{
int cube;
for ( int i; i <= N; i++) {
cube = i * i * i;
if (cube == N) {
cout << "Yes" ;
return ;
}
else if (cube > N) {
cout << "NO" ;
return ;
}
}
}
int main()
{
int N = 216;
perfectCube(N);
return 0;
}
|
Java
class GFG {
static void perfectCube( int N)
{
int cube;
for ( int i = 0 ; i <= N; i++) {
cube = i * i * i;
if (cube == N) {
System.out.println( "Yes" );
return ;
}
else if (cube > N) {
System.out.println( "NO" );
return ;
}
}
}
public static void main (String[] args)
{
int N = 216 ;
perfectCube(N);
}
}
|
Python3
def perfectCube(N) :
cube = 0 ;
for i in range (N + 1 ) :
cube = i * i * i;
if (cube = = N) :
print ( "Yes" );
return ;
elif (cube > N) :
print ( "NO" );
return ;
if __name__ = = "__main__" :
N = 216 ;
perfectCube(N);
|
C#
using System;
class GFG {
static void perfectCube( int N)
{
int cube;
for ( int i = 0; i <= N; i++) {
cube = i * i * i;
if (cube == N) {
Console.WriteLine( "Yes" );
return ;
}
else if (cube > N) {
Console.WriteLine( "NO" );
return ;
}
}
}
public static void Main ( string [] args)
{
int N = 216;
perfectCube(N);
}
}
|
Javascript
<script>
function perfectCube(N)
{
let cube;
for (let i = 0; i <= N; i++)
{
cube = i * i * i;
if (cube === N)
{
document.write( "Yes" );
return ;
}
else if (cube > N)
{
document.write( "NO" );
return ;
}
}
}
let N = 216;
perfectCube(N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Method 2: Using inbuilt function
The idea is to use the inbuilt function (cbrt()) to find the cube root of a number which returns floor value of the cube root of the number N. If the cube of this number equals N, then N is a perfect cube otherwise N is not a perfect cube.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void perfectCube( int N)
{
int cube_root;
cube_root = round(cbrt(N));
if (cube_root * cube_root * cube_root == N) {
cout << "Yes" ;
return ;
}
else {
cout << "NO" ;
return ;
}
}
int main()
{
int N = 125;
perfectCube(N);
return 0;
}
|
Java
public class GFG {
static void perfectCube( int N)
{
int cube_root;
cube_root = ( int )Math.round(Math.cbrt(N));
if (cube_root * cube_root * cube_root == N) {
System.out.println( "Yes" );
return ;
}
else {
System.out.println( "NO" );
return ;
}
}
public static void main (String[] args)
{
int N = 125 ;
perfectCube(N);
}
}
|
Python3
def perfectCube(N) :
cube_root = round (N * * ( 1 / 3 ));
if cube_root * cube_root * cube_root = = N :
print ( "Yes" );
return ;
else :
print ( "NO" );
return ;
if __name__ = = "__main__" :
N = 125 ;
perfectCube(N);
|
C#
using System;
class GFG {
static void perfectCube( int N)
{
int cube_root;
cube_root = ( int )Math.Round(Math.Cbrt(N));
if (cube_root * cube_root * cube_root == N) {
Console.WriteLine( "Yes" );
return ;
}
else {
Console.WriteLine( "NO" );
return ;
}
}
public static void Main ( string [] args)
{
int N = 125;
perfectCube(N);
}
}
|
Javascript
<script>
function perfectCube(N)
{
let cube_root;
cube_root = Math.round(Math.cbrt(N));
if ((cube_root * cube_root * cube_root) == N) {
document.write( "Yes" );
return ;
}
else {
document.write( "NO" );
return ;
}
}
let N = 125;
perfectCube(N);
</script>
|
Time Complexity: O(logN) because using inbuilt cbrt function
Auxiliary Space: O(1)
Method 3: Using Prime Factors
- Find all the Prime Factors of the given number N using the approach in this article.
- Store the frequency of all the prime factors obtained above in a Hash Map.
- Traverse the Hash Map and if the frequency of every prime factors is not a multiple of 3, then the given number N is not a perfect cube.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
map< int , int > insertPF(map< int , int > primeFact,
int fact)
{
if (primeFact.find(fact) != primeFact.end())
{
primeFact[fact]++;
}
else
{
primeFact[fact] = 1;
}
return primeFact;
}
map< int , int > primeFactors ( int n)
{
map< int , int > primeFact;
while (n % 2 == 0)
{
primeFact = insertPF(primeFact, 2);
n /= 2;
}
for ( int i = 3; i <= sqrt (n); i += 2)
{
while (n % i == 0)
{
primeFact = insertPF(primeFact, i);
n /= i;
}
}
if (n > 2)
primeFact = insertPF(primeFact, n);
return primeFact;
}
string perfectCube ( int n)
{
map< int , int > primeFact;
primeFact = primeFactors(n);
for ( auto x : primeFact)
{
if (x.second % 3 != 0)
return "No" ;
}
return "Yes" ;
}
int main()
{
int N = 216;
cout << perfectCube(N);
return 0;
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
public static HashMap<Integer, Integer>
insertPF(HashMap<Integer, Integer> primeFact,
int fact)
{
if (primeFact.containsKey(fact)) {
int freq;
freq = primeFact.get(fact);
primeFact.replace(fact, ++freq);
}
else {
primeFact.put(fact, 1 );
}
return primeFact;
}
public static HashMap<Integer, Integer>
primeFactors( int n)
{
HashMap<Integer, Integer> primeFact
= new HashMap<>();
while (n % 2 == 0 ) {
primeFact = insertPF(primeFact, 2 );
n /= 2 ;
}
for ( int i = 3 ; i <= Math.sqrt(n);
i += 2 ) {
while (n % i == 0 ) {
primeFact = insertPF(primeFact, i);
n /= i;
}
}
if (n > 2 )
primeFact = insertPF(primeFact, n);
return primeFact;
}
public static String perfectCube( int n)
{
HashMap<Integer, Integer> primeFact;
primeFact = primeFactors(n);
for ( int freq : primeFact.values()) {
if (freq % 3 != 0 )
return "No" ;
}
return "Yes" ;
}
public static void main(String[] args)
{
int N = 216 ;
System.out.println(perfectCube(N));
}
}
|
Python3
import math
def insertPF(primeFact, fact) :
if (fact in primeFact) :
primeFact[fact] + = 1
else :
primeFact[fact] = 1
return primeFact
def primeFactors (n) :
primeFact = {}
while (n % 2 = = 0 ) :
primeFact = insertPF(primeFact, 2 )
n = n / / 2
for i in range ( 3 , int (math.sqrt(n)) + 1 , 2 ) :
while (n % i = = 0 ) :
primeFact = insertPF(primeFact, i)
n = n / / i
if (n > 2 ) :
primeFact = insertPF(primeFact, n)
return primeFact
def perfectCube (n) :
primeFact = {}
primeFact = primeFactors(n)
for x in primeFact :
if (primeFact[x] % 3 ! = 0 ) :
return "No"
return "Yes"
N = 216
print (perfectCube(N))
|
C#
using System;
using System.Collections.Generic;
public class GFG {
public static Dictionary< int , int >
insertPF(Dictionary< int , int > primeFact,
int fact)
{
if (primeFact.ContainsKey(fact)) {
int freq;
freq = primeFact[fact];
primeFact[fact] = ++freq;
}
else {
primeFact.Add(fact, 1);
}
return primeFact;
}
public static Dictionary< int , int >
primeFactors( int n)
{
Dictionary< int , int > primeFact
= new Dictionary< int , int >();
while (n % 2 == 0) {
primeFact = insertPF(primeFact, 2);
n /= 2;
}
for ( int i = 3; i <= Math.Sqrt(n);
i += 2) {
while (n % i == 0) {
primeFact = insertPF(primeFact, i);
n /= i;
}
}
if (n > 2)
primeFact = insertPF(primeFact, n);
return primeFact;
}
public static String perfectCube( int n)
{
Dictionary< int , int > primeFact;
primeFact = primeFactors(n);
foreach ( int freq in primeFact.Values) {
if (freq % 3 != 0)
return "No" ;
}
return "Yes" ;
}
public static void Main(String[] args)
{
int N = 216;
Console.WriteLine(perfectCube(N));
}
}
|
Javascript
<script>
function insertPF(primeFact, fact)
{
if (primeFact.has(fact))
{
primeFact.set(fact, primeFact.get(fact)+1);
}
else
{
primeFact.set(fact, 1);
}
return primeFact;
}
function primeFactors (n)
{
var primeFact = new Map();
while (n % 2 == 0)
{
primeFact = insertPF(primeFact, 2);
n = parseInt(n/2);
}
for ( var i = 3; i <= Math.sqrt(n); i += 2)
{
while (n % i == 0)
{
primeFact = insertPF(primeFact, i);
n =parseInt(n/i);
}
}
if (n > 2)
primeFact = insertPF(primeFact, n);
return primeFact;
}
function perfectCube (n)
{
var primeFact = new Map();
primeFact = primeFactors(n);
primeFact.forEach((value, key) => {
if (value % 3 != 0)
return "No" ;
});
return "Yes" ;
}
var N = 216;
document.write( perfectCube(N));
</script>
|
Time Complexity: O(sqrt(n))
Auxiliary Space: O(sqrt(n))
Method 4 : Using Binary Search
The idea is to use the Binary Search technique where we will be searching in a range of [1, N] iteratively by dividing the range halve every time until we get the resultant output.
Algorithm:
- Initialize two variables, left and right, to 0 and the given number, respectively.
- While left is less than or equal to right follow the below steps.
- Compute the mid point and cube value.
- If cube is equal to N then return N, else change the left and right pointers accordingly.
- If no perfect cube is found in the above steps, return false, indicating that the given number is not a perfect cube.
C++
#include <iostream>
using namespace std;
bool isPerfectCube( int num)
{
long left = 0;
long right = num;
while (left <= right) {
long mid = left + (right - left) / 2;
long cube = mid * mid * mid;
if (cube == num) {
return true ;
}
else if (cube < num) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return false ;
}
int main()
{
if (isPerfectCube(729))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
public static void main(String[] args)
{
if (isPerfectCube( 729 ))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
public static boolean isPerfectCube( int num)
{
long left = 0 ;
long right = num;
while (left <= right)
{
long mid = left + (right - left) / 2 ;
long cube = mid * mid * mid;
if (cube == num)
{
return true ;
}
else if (cube < num)
{
left = mid + 1 ;
}
else
{
right = mid - 1 ;
}
}
return false ;
}
}
|
Python3
def is_perfect_cube(num):
left = 0
right = num
while left < = right:
mid = left + (right - left) / / 2
cube = mid * mid * mid
if cube = = num:
return True
elif cube < num:
left = mid + 1
else :
right = mid - 1
return False
if __name__ = = "__main__" :
if is_perfect_cube( 729 ):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG {
static bool IsPerfectCube( int num) {
long left = 0;
long right = num;
while (left <= right) {
long mid = left + (right - left) / 2;
long cube = mid * mid * mid;
if (cube == num) {
return true ;
} else if (cube < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false ;
}
static void Main( string [] args) {
if (IsPerfectCube(729)) {
Console.WriteLine( "Yes" );
} else {
Console.WriteLine( "No" );
}
}
}
|
Javascript
function isPerfectCube(num) {
let left = 0;
let right = num;
while (left <= right) {
let mid = left + Math.floor((right - left) / 2);
let cube = mid * mid * mid;
if (cube === num) {
return true ;
} else if (cube < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false ;
}
if (isPerfectCube(729)) {
console.log( "Yes" );
} else {
console.log( "No" );
}
|
Time Complexity : O(logN) [Binary Search]
Auxiliary Space : O(1)
Last Updated :
05 Oct, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...