Open In App

Check if a number is power of k using base changing method

Last Updated : 01 May, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

This program checks whether a number n can be expressed as power of k and if yes, then to what power should k be raised to make it n. Following example will clarify : 
Examples: 
 

Input :   n = 16, k = 2 
Output :  yes : 4
Explanation : Answer is yes because 16 can 
be expressed as power of 2. 
                        
Input :   n = 27, k = 3 
Output :  yes : 3
Explanation : Answer is yes as 27 can be
expressed as power of 3.

Input :  n = 20, k = 5
Output : No
Explanation : Answer is No as 20 cannot 
be expressed as power of 5.  


 


We have discussed two methods in below post 
:Check if a number is a power of another number
In this post, a new Base Changing method is discussed.
In Base Changing Method, we simply change the base of number n to k and check if the first digit of Changed number is 1 and remaining all are zero.
Example for this : Let's take n = 16 and k = 2. 
Change 16 to base 2. i.e. (10000)2. Since first digit is 1 and remaining are zero. Hence 16 can be expressed as power of 2. Count the length of (10000)2 and subtract 1 from it, that'll be the number to which 2 must be raised to make 16. In this case 5 - 1 = 4.
Another example : Let's take n = 20 and k = 3. 
20 in base 3 is (202)3. Since there are two non-zero digit, hence 20 cannot be expressed as power of 3.
 

C++
// CPP program to check if a number can be
// raised to k
#include <iostream>
#include <algorithm>
using namespace std;

bool isPowerOfK(unsigned int n, unsigned int k)
{
    // loop to change base n to base = k
    bool oneSeen = false;
    while (n > 0) {

        // Find current digit in base k
        int digit = n % k;

        // If digit is neither 0 nor 1 
        if (digit > 1)
            return false;

        // Make sure that only one 1
        // is present. 
        if (digit == 1)
        {
            if (oneSeen)
            return false;
            oneSeen = true;
        }     

        n /= k;
    }
    
    return true; 
}

// Driver code
int main()
{
    int n = 64, k = 4;

    if (isPowerOfK(n ,k))
        cout << "Yes";
    else
        cout << "No";
}
Java
// Java program to check if a number can be
// raised to k

class GFG
{
    static boolean isPowerOfK(int n,int k)
    {
        // loop to change base n to base = k
        boolean oneSeen = false;
        while (n > 0) 
        {
    
            // Find current digit in base k
            int digit = n % k;
    
            // If digit is neither 0 nor 1 
            if (digit > 1)
                return false;
    
            // Make sure that only one 1
            // is present. 
            if (digit == 1)
            {
                if (oneSeen)
                return false;
                oneSeen = true;
            }     
    
            n /= k;
        }
        
        return true; 
    }
    
    // Driver code
    public static void main (String[] args) 
    {
        int n = 64, k = 4;
    
        if (isPowerOfK(n ,k))
            System.out.print("Yes");
        else
            System.out.print("No");
    }
}

// This code is contributed by Anant Agarwal.
Python3
# Python program to
# check if a number can be
# raised to k

def isPowerOfK(n, k):

    # loop to change base
    # n to base = k
    oneSeen = False
    while (n > 0):
 
        # Find current digit in base k
        digit = n % k
 
        # If digit is neither 0 nor 1 
        if (digit > 1):
            return False
 
        # Make sure that only one 1
        # is present. 
        if (digit == 1):
        
            if (oneSeen):
                return False
            oneSeen = True
 
        n //= k
    
    return True
    
# Driver code

n = 64
k = 4
 
if (isPowerOfK(n , k)):
    print("Yes")
else:
    print("No")

# This code is contributed
# by Anant Agarwal.
C#
// C# program to check if a number can be
// raised to k
using System;

class GFG {
    
    static bool isPowerOfK(int n, int k)
    {
        
        // loop to change base n to base = k
        bool oneSeen = false;
        while (n > 0) 
        {
    
            // Find current digit in base k
            int digit = n % k;
    
            // If digit is neither 0 nor 1 
            if (digit > 1)
                return false;
    
            // Make sure that only one 1
            // is present. 
            if (digit == 1)
            {
                if (oneSeen)
                    return false;
                    
                oneSeen = true;
            } 
    
            n /= k;
        }
        
        return true; 
    }
    
    // Driver code
    public static void Main () 
    {
        int n = 64, k = 4;
    
        if (isPowerOfK(n ,k))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}

// This code is contributed by vt_m.
PHP
<?php
// PHP program to check 
// if a number can be
// raised to k

function isPowerOfK($n, $k)
{
    // loop to change base
    // n to base = k
    $oneSeen = false;
    while ($n > 0) 
    {

        // Find current 
        // digit in base k
        $digit = $n % $k;

        // If digit is 
        // neither 0 nor 1 
        if ($digit > 1)
            return false;

        // Make sure that
        // only one 1
        // is present. 
        if ($digit == 1)
        {
            if ($oneSeen)
            return false;
            $oneSeen = true;
        } 

        $n = (int)$n / $k;
    }
    
    return true; 
}

// Driver code
$n = 64;
$k = 4;

if (isPowerOfK($n, $k))
    echo "Yes";
else
    echo "No";

// This code is contributed 
// by ajit
?>
JavaScript
<script>
// JavaScript program to check if a number can be
// raised to k

    function isPowerOfK(n,k)
    {
        // loop to change base n to base = k
        let oneSeen = false;
        while (n > 0) 
        {
    
            // Find current digit in base k
            let digit = n % k;
    
            // If digit is neither 0 nor 1 
            if (digit > 1)
                return false;
    
            // Make sure that only one 1
            // is present. 
            if (digit == 1)
            {
                if (oneSeen)
                return false;
                oneSeen = true;
            }     
    
            n = Math.floor(n / k);
        }
        
        return true; 
    }

// Driver Code

        let n = 64, k = 4;
    
        if (isPowerOfK(n ,k))
            document.write("Yes");
        else
            document.write("No");
        
</script>

Output: 
 

Yes

Time Complexity: O(logK n)

Space Complexity: O(1)

Optimized Approach:

This approach avoids the need to convert n to base k and check whether it can be represented using only the digits 0 and 1. It also avoids the need to track whether a 1 has already been seen. This results in a simpler and more efficient algorithm.

Here's a step-by-step explanation of the code:

  1. Define the isPrime function which takes an integer n as input and returns true if n is prime, and false otherwise.
  2. Define the isSumOfPrimes function with parameter n.
  3. Loop over all numbers from 2 to n/2 (inclusive) as potential prime numbers, and check whether each one is a prime and whether the difference between n and that number is also a prime. The loop continues until the first pair of primes is found.
  4. If a pair of primes is found, return true. Otherwise, return false.
  5. In the main function, set n to the desired value.
  6. Call the isSumOfPrimes function with n.
  7. If the function returns true, print "Yes" to the console, indicating that n can be expressed as the sum of two prime numbers. Otherwise, print "No".
C++
#include <iostream>

using namespace std;

bool isPowerOfK(int n, int k) {
    // Check for base cases
    if (n == 0 || k == 0 || k == 1) {
        return false;
    }

    // Check if n is a power of k
    while (n % k == 0) {
        n /= k;
    }

    return n == 1;
}

int main() {
    int n = 64, k = 4;

    if (isPowerOfK(n, k)) {
        cout << "Yes";
    } else {
        cout << "No";
    }

    return 0;
}
Java
class GFG {
    static boolean isPowerOfK(int n, int k) {
        // Check for base cases
        if (n == 0 || k == 0 || k == 1) {
            return false;
        }

        // Check if n is a power of k
        while (n % k == 0) {
            n /= k;
        }

        return n == 1;
    }

    public static void main(String[] args) {
        int n = 64, k = 4;

        if (isPowerOfK(n, k)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
}
Python3
def isPowerOfK(n, k):
    # Check for base cases
    if n == 0 or k == 0 or k == 1:
        return False

    # Check if n is a power of k
    while n % k == 0:
        n //= k

    return n == 1

n = 64
k = 4

if isPowerOfK(n, k):
    print("Yes")
else:
    print("No")
C#
using System;

class GFG {
  static bool IsPowerOfK(int n, int k)
  {
    
    // Check for base cases
    if (n == 0 || k == 0 || k == 1) {
      return false;
    }

    // Check if n is a power of k
    while (n % k == 0) {
      n /= k;
    }

    return n == 1;
  }

  static void Main(string[] args) {
    int n = 64, k = 4;

    if (IsPowerOfK(n, k)) {
      Console.Write("Yes");
    } else {
      Console.Write("No");
    }
  }
}
JavaScript
function isPowerOfK(n, k) {
    // Check for base cases
    if (n === 0 || k === 0 || k === 1) {
        return false;
    }

    // Check if n is a power of k
    while (n % k === 0) {
        n = Math.floor(n / k);
    }

    return n === 1;
}

let n = 64;
let k = 4;

if (isPowerOfK(n, k)) {
    console.log("Yes");
} else {
    console.log("No");
}

OUTPUT:

YES

Time Complexity: O(logK n)

Space Complexity: O(1)


 


Next Article
Practice Tags :

Similar Reads