Número Stella Octangula

Dado un número n, comprobar si es el número de Stella Octangula o no. Un número de la forma  n(2n^{2} - 1)    donde n es un número entero (0, 1, 2, 3, 4, …) se llama Stella Octangula. Los primeros números de Stella Octangula son 0, 1, 14, 51, 124, 245, 426, 679, 1016, 1449, 1990, …
Los números de Stella octangula que son cuadrados perfectos son 1 y 9653449 .
Dado un número x, comprueba si es Stella octangula.

Ejemplos: 

Input: x = 51
Output: Yes
For n = 3, the value of expression
n(2n2 - 1) is 51

Input: n = 53
Output: No

Una solución simple es ejecutar un bucle a partir de n = 0. Para cada n, compruebe si n(2n 2 – 1) es igual a x. Ejecutamos el bucle mientras el valor de n(2n 2 – 1) es menor o igual que x.

Una solución eficiente es utilizar la búsqueda binaria ilimitada . Primero encontramos un valor de n tal que n(2n 2 – 1) es mayor que x usando duplicaciones repetidas. Luego aplicamos la búsqueda binaria .  

C++

// Program to check if a number is Stella
// Octangula Number
#include <bits/stdc++.h>
using namespace std;
 
// Returns value of n*(2*n*n - 1)
int f(int n) {
   return n*(2*n*n - 1);
}
 
// Finds if a value of f(n) is equal to x
// where n is in interval [low..high]
bool binarySearch(int low, int high, int x)
{
    while (low <= high) {
        long long mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x isStella Octangula Number.
// Else returns false.
bool isStellaOctangula(int x)
{
    if (x == 0)
      return true;
 
    // Find 'high' for binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i*2;
 
    // If condition is satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    //  Call binary search
    return binarySearch(i/2, i, x);
}
 
// driver code
int main()
{
    int n = 51;
    if (isStellaOctangula(n))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}

Java

// Program to check if
// a number is Stella
// Octangula Number
import java.io.*;
 
class GFG
{
 
// Returns value of
// n*(2*n*n - 1)
static int f(int n)
{
    return n * (2 * n *
                n - 1);
}
 
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
static boolean binarySearch(int low,
                            int high,
                            int x)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
static boolean isStellaOctangula(int x)
{
    if (x == 0)
    return true;
 
    // Find 'high' for
    // binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i * 2;
 
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
public static void main (String[] args)
{
    int n = 51;
    if (isStellaOctangula(n))
        System.out.print("Yes");
    else
        System.out.print("No");
}
}
 
// This code is contributed
// by anuj_67.

Python3

# Python3 program to check if a number
# is Stella octangula number
 
# Returns value of n*(2*n*n - 1)
def f(n):
     
    return n * (2 * n * n - 1);
 
# Finds if a value of f(n) is equal to x
# where n is in interval [low..high]
def binarySearch(low, high, x):
 
    while (low <= high):
        mid = int((low + high) // 2);
 
        if (f(mid) < x):
            low = mid + 1;
        elif (f(mid) > x):
            high = mid - 1;
        else:
            return True;
             
    return False;
 
# Returns true if x isStella octangula
#  number. Else returns false.
def isStellaOctangula(x):
 
    if (x == 0):
        return True;
 
    # Find 'high' for binary search
    # by repeated doubling
    i = 1;
    while (f(i) < x):
        i = i * 2;
 
    # If condition is satisfied for a
    # power of 2.
    if (f(i) == x):
        return True;
 
    # Call binary search
    return binarySearch(i / 2, i, x);
 
# Driver code
n = 51;
 
if (isStellaOctangula(n) == True):
    print("Yes");
else:
    print("No");
 
# This code is contributed by Code_Mech

C#

// Program to check if
// a number is Stella
// Octangula Number
using System;
 
class GFG
{
 
// Returns value of
// n*(2*n*n - 1)
static int f(int n)
{
    return n * (2 * n *
                n - 1);
}
 
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
static bool binarySearch(int low,
                         int high,
                         int x)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
static bool isStellaOctangula(int x)
{
    if (x == 0)
    return true;
 
    // Find 'high' for
    // binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i * 2;
 
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
public static void Main ()
{
    int n = 51;
    if (isStellaOctangula(n))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
}
 
// This code is contributed
// by anuj_67.

Javascript

<script>
 
// JavaScript program to check if
// a number is Stella
// Octangula Number
 
// Returns value of
// n*(2*n*n - 1)
function f(n)
{
    return n * (2 * n *
                n - 1);
}
   
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
function binarySearch(low, high, x)
{
    while (low <= high)
    {
        let mid = (low + high) / 2;
   
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
   
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
function isStellaOctangula(x)
{
    if (x == 0)
    return true;
   
    // Find 'high' for
    // binary search by
    // repeated doubling
    let i = 1;
    while (f(i) < x)
        i = i * 2;
   
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
   
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
 
    let n = 51;
    if (isStellaOctangula(n))
        document.write("Yes");
    else
        document.write("No");
           
          // This code is contributed by souravghosh0416.
</script>
Producción: 

Yes

 

Publicación traducida automáticamente

Artículo escrito por jaideeppyne1997 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 *