Рубрики

Проверьте, имеет ли двоичное представление числа равное число 0 и 1 в блоках

Учитывая целое число N, задача состоит в том, чтобы проверить, имеет ли его эквивалентное двоичное число равную частоту последовательных блоков 0 и 1. Обратите внимание, что 0 и число со всеми 1 не считаются имеющими количество блоков 0 и 1.

Примеры:

Input: N = 5
Output: Yes
Equivalent binary number of 5 is 101.
The first block is of 1 with length 1, the second block is of 0 with length 1
and the third block is of 1 is also of length 1. So, all blocks of 0 and 1 have an equal frequency which is 1.

Input: N = 51
Output: Yes
Equivalent binary number of 51 is 110011.

Input: 8
Output: No

Input: 7
Output: No

Простой подход: сначала преобразуйте целое число в его эквивалентное двоичное число. Пройдите двоичную строку слева направо, для каждого блока 1 или 0 найдите ее длину и добавьте ее в набор. Если длина набора равна 1, выведите «Yes», иначе выведите «No».

# Реализация Python выше
# подходить

    
# Функция для проверки

def hasEqualBlockFrequency(N):

    

    # Преобразование целого числа в его эквивалент

    # двоичное число

    S = bin(N).replace("0b", "")

    p = set()

    c = 1

  

    for i in range(len(S)-1):

  

        # Если соседние символы одинаковы

        # затем увеличить счетчик

        if (S[i] == S[i + 1]):

            c += 1

  

        else:

            p.add(c)

            c = 1

  

        p.add(c)

  

    if (len(p) == 1):

        print("Yes")

    else:

        print("No")

  
# Код драйвера

N = 5

hasEqualBlockFrequency(N)

Выход:

Yes

Оптимизированное решение: мы переходим от последнего бита. Сначала мы посчитаем количество одинаковых битов в последнем блоке. Затем мы просматриваем все биты, для каждого блока мы подсчитываем количество одинаковых битов, и если этот счет не совпадает с первым счетом, мы возвращаем false. Если все блоки имеют одинаковое количество, мы возвращаем true.

C ++

// C ++ программа для проверки наличия номера
// одинаковые значения 0 и 1 в каждом
// блок.

  
#include <iostream>

using namespace std;

  
// функция для преобразования десятичного числа в двоичное

bool isEqualBlock(int n)

{

    // Считаем одинаковые биты в последнем блоке

    int first_bit = n % 2;

    int first_count = 1;

    n = n / 2;

    while (n % 2 == first_bit && n > 0) {

        n = n / 2;

        first_count++;

    }

  

    // Если n равно 0 или имеет все 1,

    // тогда это не считается

    // имеют одинаковое количество 0 и

    // 1с в блоках.

    if (n == 0)

        return false;

  

    // Считаем одинаковые биты во всех оставшихся блоках.

    while (n > 0) {

  

        int first_bit = n % 2;

        int curr_count = 1;

        n = n / 2;

        while (n % 2 == first_bit) {

            n = n / 2;

            curr_count++;

        }

  

        if (curr_count != first_count)

            return false;

    }

  

    return true;

}

  
// Программа драйвера для проверки вышеуказанной функции

int main()

{

    int n = 51;

    if (isEqualBlock(n))

        cout << "Yes";

    else

        cout << "No";

    return 0;

}

Джава

// Java-программа для проверки наличия номера
// одинаковые значения 0 и 1 в каждом
// блок.

import java.io.*;

  

class GFG

{

  
// функция для преобразования десятичного числа в двоичное

static boolean isEqualBlock(int n)

{

    // Считаем одинаковые биты в последнем блоке

    int first_bit = n % 2;

    int first_count = 1;

    n = n / 2;

    while (n % 2 == first_bit && n > 0

    {

        n = n / 2;

        first_count++;

    }

  

    // Если n равно 0 или имеет все 1,

    // тогда это не считается

    // имеют одинаковое количество 0 и

    // 1с в блоках.

    if (n == 0)

        return false;

  

    // Считаем одинаковые биты во всех оставшихся блоках.

    while (n > 0

    {

  

        first_bit = n % 2;

        int curr_count = 1;

        n = n / 2;

        while (n % 2 == first_bit) 

        {

            n = n / 2;

            curr_count++;

        }

  

        if (curr_count != first_count)

            return false;

    }

    return true;

}

  
// Код драйвера

public static void main (String[] args)

{

    int n = 51;

    if (isEqualBlock(n))

        System.out.println( "Yes");

    else

        System.out.println("No");

}
}

  
// Этот код предоставлен inder_mca

python3

# Python3 программа для проверки наличия номера
# одинаковые значения 0 и 1 в каждом блоке.

  
# Функция для преобразования десятичной в двоичную

def isEqualBlock(n): 

  

    # Считать одинаковые биты в последнем блоке

    first_bit = n % 2

    first_count = 1

    n = n // 2

    while n % 2 == first_bit and n > 0

        n = n // 2

        first_count += 1

  

    # Если n равно 0 или имеет все 1,

    # тогда это не считается

    # имеют равное количество нулей и

    №1 в блоках.

    if n == 0:

        return False

  

    # Считать одинаковые биты во всех оставшихся блоках.

    while n > 0

  

        first_bit = n % 2

        curr_count = 1

        n = n // 2

        while n % 2 == first_bit: 

            n = n // 2

            curr_count += 1

          

        if curr_count != first_count: 

            return False

      

    return True

  
Код водителя

if __name__ == "__main__"

  

    n = 51

    if isEqualBlock(n): 

        print("Yes")

    else:

        print("No"

      
# Этот код предоставлен
# Ритурай Джайн

C #

// C # программа для проверки наличия номера
// одинаковые значения 0 и 1 в каждом
// блок.

  

using System;

  

class GFG 

  

    // функция для преобразования десятичного числа в двоичное

    static bool isEqualBlock(int n) 

    

        // Считаем одинаковые биты в последнем блоке

        int first_bit = n % 2; 

        int first_count = 1; 

        n = n / 2; 

        while (n % 2 == first_bit && n > 0) 

        

            n = n / 2; 

            first_count++; 

        

      

        // Если n равно 0 или имеет все 1,

        // тогда это не считается

        // имеют одинаковое количество 0 и

        // 1с в блоках.

        if (n == 0) 

            return false

      

        // Считаем одинаковые биты во всех оставшихся блоках.

        while (n > 0) 

        

      

            first_bit = n % 2; 

            int curr_count = 1; 

            n = n / 2; 

              

            while (n % 2 == first_bit) 

            

                n = n / 2; 

                curr_count++; 

            

              

            if (curr_count != first_count) 

                return false

        

        return true

    

      

    // Код драйвера

    public static void Main () 

    

        int n = 51; 

          

        if (isEqualBlock(n)) 

            Console.WriteLine( "Yes"); 

        else

            Console.WriteLine("No"); 

    

  
// Этот код предоставлен Ryuga

PHP

<?php
// PHP программа для проверки наличия номера
// одинаковые значения 0 и 1 в каждом
// блок.

  
// функция для преобразования десятичного числа в двоичное

function isEqualBlock($n)

{

    // Считаем одинаковые биты в последнем блоке

    $first_bit = $n % 2;

    $first_count = 1;

    $n = (int)($n / 2);

    while ($n % 2 == $first_bit && $n > 0) 

    {

        $n = (int)($n / 2);

        $first_count++;

    }

  

    // Если n равно 0 или имеет все 1, то

    // не считается равным

    // количество 0 и 1 в блоках.

    if ($n == 0)

        return false;

  

    // Считаем одинаковые биты во всех оставшихся блоках.

    while ($n > 0) 

    {

        $first_bit = $n % 2;

        $curr_count = 1;

        $n = (int)($n / 2);

        while ($n % 2 == $first_bit

        {

            $n = (int)($n / 2);

            $curr_count++;

        }

  

        if ($curr_count != $first_count)

            return false;

    }

  

    return true;

}

  
// Код драйвера

$n = 51;

if (isEqualBlock($n))

    echo "Yes";

else

    echo "No";

  
// Этот код предоставлен
// Shivi_Aggarwal
?>

Выход:

Yes

Рекомендуемые посты:

Проверьте, имеет ли двоичное представление числа равное число 0 и 1 в блоках

0.00 (0%) 0 votes