Comprobar la divisibilidad en un flujo binario

Se acerca un flujo de números binarios, la tarea es decir que el número formado hasta ahora es divisible por un número dado n. En un momento dado, obtendrás 0 o 1 y dirás si el número formado con estos bits es divisible por n o no. Generalmente, las empresas de comercio electrónico hacen este tipo de preguntas. Me lo preguntaron en la entrevista de Microsoft. En realidad, esa pregunta era un poco simple, el entrevistador fijó la n en 3. Método 1 (Simple pero causa desbordamiento): Continúe calculando el número formado y solo verifique la divisibilidad entre n. 

C

/* Simple implementation of the logic,
   without error handling compiled with
   Microsoft visual studio 2015 */
void CheckDivisibility2(int n)
{
    int num = 0;
    std::cout << "press any key other than"
                " 0 and 1 to terminate \n";
    while (true)
    {
        int incomingBit;
 
        // read next incoming bit via standard
        // input. 0, 00, 000.. are same as int 0
        // ans 1, 01, 001, 00..001 is same as 1.
        std::cin >> incomingBit;
 
        // Update value of num formed so far
        if (incomingBit == 1)
            num = (num * 2 + 1);
        else if (incomingBit == 0)
            num = (num * 2);
 
        else
            break;
        if (num % n == 0)
            std::cout << "yes \n";
        else
            std::cout << "no \n";
    }
}

Problema en esta solución: ¿Qué pasa con el desbordamiento? Dado que 0 y 1 seguirán apareciendo y el número formado saldrá del rango de entero.  Método 2 (no causa desbordamiento): en esta solución, solo mantenemos el resto si el resto es 0, el número formado es divisible por n, de lo contrario no. Esta es la misma técnica que se usa en Automata.para recordar el estado. Aquí también estamos recordando el estado de divisibilidad del número de entrada. Para implementar esta técnica, necesitamos observar cómo cambia el valor de un número binario, cuando se agrega 0 o 1. Tomemos un ejemplo. Supongamos que tiene el número binario 1. Si se agrega 0, se convertirá en 10 (2 en decimal), lo que significa 2 veces el valor anterior. Si se le añade 1 se convertirá en 11 (3 en decimal), 2 veces el valor anterior +1. ¿Cómo ayuda a obtener el resto?Cualquier número (n) se puede escribir en la forma m = an + r donde a, n y r son números enteros y r es el resto. Entonces, cuando m se multiplica por cualquier número, el resto. Supongamos que m se multiplica por x, por lo que m será mx = xan + xr. entonces (mx)%n = (xan)%n + (xr)%n = 0 + (xr)%n = (xr)%n; Solo necesitamos hacer el cálculo anterior (cálculo del valor del número cuando se agrega 0 o 1) solo sobre el resto.

When a binary number is appended by 0 (means 
multiplied by 2), the new remainder can be 
calculated based on current remainder only.
r = 2*r % n;

And when a binary number is appended by 1.
r = (2*r + 1) % n; 

CPP

// C++ program to check divisibility in a stream
#include <iostream>
using namespace std;
   
/*  A very simple implementation of the logic,
    without error handling. just to demonstrate
    the above theory. This simple version not
    restricting user from typing 000, 00 , 000.. ,
    because this all will be same as 0 for integer
    same is true for 1, 01, 001, 000...001 is same
    as 1, so ignore this type of error handling
    while reading just see the main logic is correct. */
void CheckDivisibility(int n)
{
    int remainder = 0;
    std::cout << "press any key other than 0"
                 " and 1 to terminate \n";
    while (true)
    {
        // Read next incoming bit via standard
        // input. 0, 00, 000.. are same as int 0
        // ans 1, 01, 001, 00..001 is same as 1.
        int incomingBit;
        cin >> incomingBit;
   
        // Update remainder
        if (incomingBit == 1)
            remainder = (remainder * 2 + 1) % n;
        else if (incomingBit == 0)
            remainder = (remainder * 2) % n;
        else
            break;
   
        // If remainder is 0.
        if (remainder % n == 0)
            cout << "yes \n";
        else
            cout << "no \n";
    }
}
   
// Driver code
int main()
{
    CheckDivisibility(3);
    return 0;
}

Java

// Java program to check divisibility in a stream
import java.util.Scanner;
   
/*  A very simple implementation of the logic,
    without error handling. just to demonstrate
    the above theory. This simple version not
    restricting user from typing 000, 00 , 000.. ,
    because this all will be same as 0 for integer
    same is true for 1, 01, 001, 000...001 is same
    as 1, so ignore this type of error handling
    while reading just see the main logic is correct. */
class GFG {
    static void CheckDivisibility(int n)
    {
        Scanner console = new Scanner(System.in);
        int remainder = 0;
        System.out.print("press any key other than 0 and 1 to terminate \n");
        while (true)
        {
            // Read next incoming bit via standard
            // input. 0, 00, 000.. are same as int 0
            // ans 1, 01, 001, 00..001 is same as 1.
            int incomingBit = console.nextInt();
 
            // Update remainder
            if (incomingBit == 1)
                remainder = (remainder * 2 + 1) % n;
            else if (incomingBit == 0)
                remainder = (remainder * 2) % n;
            else
                break;
       
            // If remainder is 0.
            if (remainder % n == 0)
                System.out.print("yes \n");
            else
                System.out.print("no \n");
        }
}
 
    //Driver code
    public static void main(String[] args) {
        CheckDivisibility(3);
    }
}
 
//This code is contributed by phasing17

Python3

#Python3 program to check divisibility in a stream
 
'''  A very simple implementation of the logic,
    without error handling. just to demonstrate
    the above theory. This simple version not
    restricting user from typing 000, 00 , 000.. ,
    because this all will be same as 0 for integer
    same is true for 1, 01, 001, 000...001 is same
    as 1, so ignore this type of error handling
    while reading just see the main logic is correct. '''
     
def CheckDivisibility(n):
 
    remainder = 0
    print("press any key other than 0"
                 " and 1 to terminate")
    while (True):
     
        # Read next incoming bit via standard
        # input. 0, 00, 000.. are same as int 0
        # ans 1, 01, 001, 00..001 is same as 1.
        incomingBit = int(input())
 
        # Update remainder
        if (incomingBit == 1):
            remainder = (remainder * 2 + 1) % n
        elif (incomingBit == 0):
            remainder = (remainder * 2) % n
        else:
            break
   
        # If remainder is 0.
        if (remainder % n == 0):
            print("yes")
        else:
            print("no")
     
 
   
# Driver code
CheckDivisibility(3)
 
#this code is contributed by phasing17

C#

// C# program to check divisibility in a stream
using System;
 
/*  A very simple implementation of the logic,
    without error handling. just to demonstrate
    the above theory. This simple version not
    restricting user from typing 000, 00 , 000.. ,
    because this all will be same as 0 for integer
    same is true for 1, 01, 001, 000...001 is same
    as 1, so ignore this type of error handling
    while reading just see the main logic is correct. */
public class GFG
{
    static void CheckDivisibility(int n)
    {
        int remainder = 0;
        Console.Write("press any key other than 0 and 1 to terminate \n");
        while (true)
        {
            // Read next incoming bit via standard
            // input. 0, 00, 000.. are same as int 0
            // ans 1, 01, 001, 00..001 is same as 1.
            int incomingBit = Convert.ToInt32(Console.ReadLine());
 
            // Update remainder
            if (incomingBit == 1)
                remainder = (remainder * 2 + 1) % n;
            else if (incomingBit == 0)
                remainder = (remainder * 2) % n;
            else
                break;
       
            // If remainder is 0.
            if (remainder % n == 0)
                Console.Write("yes \n");
            else
                Console.Write("no \n");
        }
}
       
    //Driver Code
    public static void Main(string[] args)
    {
          //Function call
        CheckDivisibility(3);
    }
}
 
// This code is contributed by phasing17

Aporte:

1
0
1
0
1
-1

Producción:

Press any key other than 0 and 1 to terminate 
no 
no 
no 
no 
yes 

Artículos relacionados: división basada en DFA Comprobar si una secuencia es múltiplo de 3 Puneet contribuye con este artículo . 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 *