Comprobar si un número es potencia de 8 o no

Dado un número, comprueba si es una potencia de 8 o no.

Ejemplos: 

Input : n = 64
Output : Yes

Input : 75
Output : No

Primera solución

Calculamos log8(n) del número si es un número entero, entonces n está en la potencia de 8. Usamos la función trunc(n) que encuentra el número entero más cercano para un valor doble. 

C++

// C++ program to check if a number is power of 8
#include <cmath>
#include <iostream>
using namespace std;
 
/* function to check if power of 8 */
bool checkPowerof8(int n)
{
    /* calculate log8(n) */
    double i = log(n) / log(8);
 
    /* check if i is an integer or not */
    return (i - trunc(i) < 0.000001);
}
 
/* driver function */
int main()
{
    int n = 65;
    checkPowerof8(n) ? cout << "Yes" : cout << "No";
    return 0;
}

Java

// Java program to check if
// a number is power of 8
 
class GFG {
 
    // function to check
    // if power of 8
    static boolean checkPowerof8(int n)
    {
        /* calculate log8(n) */
        double i = Math.log(n) / Math.log(8);
 
        /* check if i is an integer or not */
        return (i - Math.floor(i) < 0.000001);
    }
 
    // Driver Code
    public static void main(String args[])
    {
        int n = 65;
        if (checkPowerof8(n))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Sam007

Python3

# Python3 program to check
# if a number is power of 8
from math import log,trunc
 
# function to check if power of 8
def checkPowerof8(n):
 
    # calculate log8(n)
    i = log(n, 8)
 
    # check if i is an integer or not
    return (i - trunc(i) < 0.000001);
 
# Driver Code
n = 65
if checkPowerof8(n):
    print("Yes")
else:
    print("No")
 
# This code is contributed by Mohit Kumar

C#

// C#  program to check if
// a number is power of 8
using System;
 
class GFG {
 
    // function to check
    // if power of 8
    static bool checkPowerof8(int n)
    {
 
        // calculate log8(n) */
        double i = Math.Log(n) / Math.Log(8);
 
        // check if i is an integer or not */
        return (i - Math.Floor(i) < 0.000001);
    }
 
    // Driver Code
    static public void Main()
    {
        int n = 65;
 
        if (checkPowerof8(n))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by akt_mit

PHP

<?php
// PHP program to check if
// a number is power of 8
 
// function to check
// if power of 8
function checkPowerof8($n)
{
    /* calculate log8(n) */
    $i = log($n) / log(8);
 
    /* check if i is an integer or not */
    return ($i - floor($i) < 0.000001);
}
 
// Driver Code
$n = 65;
if(checkPowerof8($n))
    echo "Yes";
else
    echo "No";
 
// This code is contributed
// by Sach_Code
?>

Javascript

<script>
 
    // Javascript program to check if
    // a number is power of 8
     
    // function to check
    // if power of 8
    function checkPowerof8(n)
    {
  
        // calculate log8(n) */
        let i = Math.log(n) / Math.log(8);
  
        // check if i is an integer or not */
        return (i - Math.floor(i) < 0.000001);
    }
     
    let n = 65;
  
    if (checkPowerof8(n))
      document.write("Yes");
    else
      document.write("No");
     
</script>

Producción : 

No

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

Segunda solución
Un número es una potencia de 8 si se cumplen las siguientes condiciones. 

  1. El número es la potencia de dos . Un número es la potencia de dos si tiene un solo bit establecido, es decir, bit a bit y de n y n-1 es 0.
  2. El número tiene su único conjunto un bit en la posición 0 o 3 o 6 o …. 30 [Para un número de 32 bits]. Para verificar la posición de su bit establecido, podemos usar una máscara (0xB6DB6DB6) 16 = (10110110110110110110110110110110) 2 .

A continuación se muestra la implementación de la idea anterior. 

C++

// C++ program to check if a number is power of 8
// using bit mask.
#include <bits/stdc++.h>
using namespace std;
 
/*function to check if power of 8*/
bool checkPowerof8(int n)
{
    return (n && !(n & (n - 1)) && !(n & 0xB6DB6DB6));
}
 
/*driver function*/
int main()
{
    int n = 65;
    checkPowerof8(n) ? cout << "Yes" : cout << "No";
 
    return 0;
}

Java

// Java program to check if a
// number is power of 8 using
// bit mask.
import java.util.*;
class GFG{
 
// function to check if
// power of 8
static boolean checkPowerof8(int n)
{
  return (n > 0 && (n & (n - 1)) > 0 &&
         (n & 0xB6DB6DB6) > 0);
}
 
// Driver code
public static void main(String[] args)
{
  int n = 65;
  if (checkPowerof8(n) == true)
    System.out.print("Yes" );
  else
    System.out.print("No");
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 program to check if a number
# is power of 8
 
# function to check if power of 8
def checkPowerof8(n):
 
    return (n and not (n & (n - 1)) and
                  not (n & 0xB6DB6DB6))
 
# Driver Code
if __name__ == "__main__":
 
    n = 65
     
if checkPowerof8(n):
    print ("Yes") 
else:
    print ("No")
 
# This code is contributed by ita_c

C#

// C# program to check if a
// number is power of 8 using
// bit mask.
using System;
 
class GFG{
     
// Function to check if
// power of 8
static bool checkPowerof8(int n)
{
    return (n > 0 && (n & (n - 1)) > 0 &&
           (n & 0xB6DB6DB6) > 0);
}
 
// Driver code
static public void Main()
{
    int n = 65;
     
    if (checkPowerof8(n) == true)
    {
        Console.WriteLine("Yes");
    }
    else
    {
        Console.WriteLine("No");
    }
}
}
 
// This code is contributed by avanitrachhadiya2155

PHP

<?php
// PHP program to check if a number
// is power of 8 using bit mask.
 
// function to check if power of 8
function checkPowerof8($n)
{
    $t = ($n && !($n & ($n - 1)) &&
                !($n & 0xB6DB6DB6));
    return $t;
}
 
// Driver Code
$n = 65;
if(checkPowerof8($n))
    echo "Yes" ;
else
    echo "No";
 
// This code is contributed by Sach
?>

Javascript

<script>
 
/*function to check if power of 8*/
function checkPowerof8( n)
{
    return (n && !(n & (n - 1)) && !(n & 0xB6DB6DB6));
}
 
var n = 65;
    if(checkPowerof8(n))
    document.write("Yes" );
    else
    document.write("No");
 
 
</script>

Producción : 

No

Complejidad de tiempo : O(1)

Espacio Auxiliar: O(1)

Una simple observación que se puede hacer aquí es que si un número es la potencia de 8, entonces solo tiene un conjunto de un bit y ese bit está en las posiciones 1, 4, 7, 10, … 
Por lo tanto, podemos verificar si el solo el bit establecido en el número está en una de estas posiciones, entonces es una potencia de 8; de lo contrario, no.

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if n is power of 8
bool checkPowerof8(int n)
{
    // Variable i will denote the bit
    // that we are currently at
    int i = 0;
    unsigned long long l = 1;
    while (i <= 63) {
        l <<= i;
 
        // If only set bit in n
        // is at position i
        if (l == n)
            return true;
 
        // Get to next valid bit position
        i += 3;
        l = 1;
    }
    return false;
}
 
// Driver code
int main()
{
    int n = 65;
    if (checkPowerof8(n))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}

Java

// Java implementation of the approach
import java.io.*;
 
class GFG
{
     
// Function to check if n is power of 8
static boolean checkPowerof8(int n)
{
    // Variable i will denote the bit
    // that we are currently at
    int i = 0;
    long l = 1;
    while (i <= 63)
    {
        l <<= i;
 
        // If only set bit in n
        // is at position i
        if (l == n)
            return true;
 
        // Get to next valid bit position
        i += 3;
        l = 1;
    }
    return false;
}
 
// Driver code
public static void main (String[] args)
{
     
    int n = 65;
    if (checkPowerof8(n))
        System.out.println ("Yes");
    else
        System.out.println( "No");
}
}
 
// This code is contributed by Tushil.

Python3

# Python3 implementation of the approach
 
# Function to check if n is power of 8
def checkPowerof8(n):
     
    # Variable i will denote the bit
    # that we are currently at
    i = 0
    l = 1
     
    while (i <= 63):
        l <<= i
 
        # If only set bit in n
        # is at position i
        if (l == n):
            return True
 
        # Get to next valid bit position
        i += 3
        l = 1
   
    return False
   
# Driver code
if __name__ == '__main__':
      
    n = 65
    if (checkPowerof8(n)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by math_lover

C#

// C# implementation of the approach
using System;
 
class GFG
{
     
// Function to check if n is power of 8
static bool checkPowerof8(int n)
{
    // Variable i will denote the bit
    // that we are currently at
    int i = 0;
    long l = 1;
    while (i <= 63)
    {
        l <<= i;
 
        // If only set bit in n
        // is at position i
        if (l == n)
            return true;
 
        // Get to next valid bit position
        i += 3;
        l = 1;
    }
    return false;
}
 
// Driver code
static public void Main ()
{
    int n = 65;
    if (checkPowerof8(n))
        Console.WriteLine("Yes");
    else
        Console.WriteLine( "No");
}
}
 
// This code is contributed by ajit.

Javascript

<script>
 
 
// Function to check if n is power of 8
function checkPowerof8( n)
{
    // Variable i will denote the bit
    // that we are currently at
    var i = 0;
    var l= 1;
    while (i <= 63) {
        l<<=i;
 
        // If only set bit in n
        // is at position i
        if (l == n)
            return 1;
 
        // Get to next valid bit position
        i += 3;
        l = 1;
    }
    return 0;
}
 
var n = 65;
    if (checkPowerof8(n))
        document.write( "Yes");
    else
        document.write("No");
 
 
 
</script>

Producción : 

No

Complejidad de tiempo : O(1)

Espacio Auxiliar: O(1)

Este artículo es una contribución de Pranav . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *