Para comprobar la divisibilidad de cualquier número grande por 999

Se le da un número grande de n dígitos, debe verificar si es divisible por 999 sin dividir o encontrar el módulo del número por 999.

Ejemplos: 

Input : 235764 
Output : Yes

Input : 23576 
Output : No

Dado que el número de entrada puede ser muy grande, no podemos usar n % 999 para verificar si un número es divisible por 999 o no, especialmente en lenguajes como C/C++. La idea se basa en el siguiente hecho.

Las soluciones se basan en el siguiente hecho.

Un número es divisible por 999 si la suma de sus grupos de 3 dígitos (si los grupos requeridos se forman agregando 0 al principio) es divisible por 999.

Ilustración: 

Input : 235764 
Output : Yes
Explanation : Step I - read input : 235, 764
              Step II - 235 + 764 = 999
              As result is 999 then we can 
              conclude that it is divisible by 999.

Input : 1244633121
Output : Yes
Explanation : Step I - read input : 1, 244, 633, 121
              Step II - 001 + 244 + 633 + 121 = 999
              As result is 999 then we can conclude 
              that it is divisible by 999.

Input : 999999999
Output : Yes
Explanation : Step I - read input : 999, 999, 999
              Step II - 999 + 999 + 999 = 2997
              Step III - 997 + 002 = 999
              As result is 999 then we can conclude  
              that it is divisible by 999.

¿Como funciona esto? 

Let us consider 235764, we can write it as
235764 = 2*105 + 3*104 + 5*103 + 
         7*102 + 6*10 + 4

The idea is based on below observation:
Remainder of 103 divided by 999 is 1
For i > 3, 10i % 999 = 10i-3 % 999 

Let us see how we use above fact.
Remainder of 2*105 + 3*104 + 5*103 + 
7*102 + 6*10 + 4
Remainder with 999 can be written as : 
2*100 + 3*10 + 5*1 + 7*100 + 6*10 + 4 
The above expression is basically sum of
groups of size 3.

Since the sum is divisible by 999, answer is yes.

Un método simple y eficiente es tomar la entrada en forma de string (haga su longitud en forma de 3*m agregando 0 a la izquierda del número si es necesario) y luego debe agregar los dígitos en bloques de tres de derecha a izquierda hasta se convierte en un número de 3 dígitos y si ese resultado es 999 podemos decir que ese número es divisible por 999.

Como en el caso de «divisibilidad por 9» verificamos que la suma de todos los dígitos es divisible por 9 o no, lo mismo ocurre en el caso de divisibilidad por 999. Sumamos todos los grupos de 3 dígitos de derecha a izquierda y verificamos si el resultado final es 999 o no.

Implementación:
 

C++

// CPP for divisibility of number by 999
#include<bits/stdc++.h>
using namespace std;
 
// function to check divisibility
bool isDivisible999(string num)
{
    int n = num.length();
    if (n == 0 && num[0] == '0')
       return true;
 
    // Append required 0s at the beginning.
    if (n % 3 == 1)
       num = "00" + num;
    if (n % 3 == 2)
       num = "0" + num;
 
    // add digits in group of three in gSum
    int gSum = 0;
    for (int i = 0; i<n; i++)
    {
        // group saves 3-digit group
        int group = 0;
        group += (num[i++] - '0') * 100;
        group += (num[i++] - '0') * 10;
        group += num[i] - '0';
        gSum += group;
    }
 
    // calculate result till 3 digit sum
    if (gSum > 1000)
    {
        num = to_string(gSum);
        n = num.length();
        gSum = isDivisible999(num);
    }
    return (gSum == 999);
}
 
// driver program
int main()
{
    string num = "1998";
    int n = num.length();
    if (isDivisible999(num))
        cout << "Divisible";
    else
        cout << "Not divisible";
    return 0;
}

Java

//Java for divisibility of number by 999
 
class Test
{   
    // Method to check divisibility
    static boolean isDivisible999(String num)
    {
        int n = num.length();
        if (n == 0 && num.charAt(0) == '0')
           return true;
      
        // Append required 0s at the beginning.
        if (n % 3 == 1)
           num = "00" + num;
        if (n % 3 == 2)
           num = "0" + num;
      
        // add digits in group of three in gSum
        int gSum = 0;
        for (int i = 0; i<n; i++)
        {
            // group saves 3-digit group
            int group = 0;
            group += (num.charAt(i++) - '0') * 100;
            group += (num.charAt(i++) - '0') * 10;
            group += num.charAt(i) - '0';
            gSum += group;
        }
      
        // calculate result till 3 digit sum
        if (gSum > 1000)
        {
            num = Integer.toString(gSum);
            n = num.length();
            gSum = isDivisible999(num) ? 1 : 0;
        }
        return (gSum == 999);
    }
     
    // Driver method
    public static void main(String args[])
    {
        String num = "1998";
      
        System.out.println(isDivisible999(num) ? "Divisible" : "Not divisible");
    }
}

Python 3

# Python3 program for divisibility
# of number by 999
 
# function to check divisibility
def isDivisible999(num):
    n = len(num);
    if(n == 0 or num[0] == '0'):
        return true
 
    # Append required 0s at the beginning.
    if((n % 3) == 1):
        num = "00" + num
    if((n % 3) == 2):
        num = "0" + num
 
    # add digits in group of three in gSum    
    gSum = 0
    for i in range(0, n, 3):
         
        # group saves 3-digit group
        group = 0
        group += (ord(num[i]) - 48) * 100
        group += (ord(num[i + 1]) - 48) * 10
        group += (ord(num[i + 2]) - 48)
        gSum += group
 
    # calculate result till 3 digit sum    
    if(gSum > 1000):
        num = str(gSum)
        n = len(num)
        gSum = isDivisible999(num)
    return (gSum == 999)
 
# Driver code
if __name__=="__main__":
    num = "1998"
    n = len(num)
    if(isDivisible999(num)):
        print("Divisible")
    else:
        print("Not divisible")
         
# This code is contributed
# by Sairahul Jella

C#

// C# code for divisibility of number by 999
 
using System;
class Test
{
    // Method to check divisibility
    static bool isDivisible999(String num)
    {
        int n = num.Length;
        if (n == 0 && num[0] == '0')
        return true;
     
        // Append required 0s at the beginning.
        if (n % 3 == 1)
        num = "00" + num;
        if (n % 3 == 2)
        num = "0" + num;
     
        // add digits in group of three in gSum
        int gSum = 0;
        for (int i = 0; i<n; i++)
        {
            // group saves 3-digit group
            int group = 0;
            group += (num[i++] - '0') * 100;
            group += (num[i++] - '0') * 10;
            group += num[i] - '0';
            gSum += group;
        }
     
        // calculate result till 3 digit sum
        if (gSum > 1000)
        {
            num = Convert.ToString(gSum);
            n = num.Length ;
            gSum = isDivisible999(num) ? 1 : 0;
        }
        return (gSum == 999);
    }
     
    // Driver method
    public static void Main()
    {
        String num = "1998";
     
        Console.WriteLine(isDivisible999(num) ? "Divisible" : "Not divisible");
    }
    // This code is contributed by Ryuga
}

PHP

<?php
// PHP for divisibility of number by 999
 
// function to check divisibility
function isDivisible999($num)
{
    $n = strlen($num);
    if ($n == 0 && $num[0] == '0')
    return true;
 
    // Append required 0s at the beginning.
    if ($n % 3 == 1)
        $num = "00" . $num;
    if ($n % 3 == 2)
        $num = "0" . $num;
 
    // add digits in group of three in gSum
    $gSum = 0;
    for ($i = 0; $i < $n; $i += 3)
    {
        // group saves 3-digit group
        $group = 0;
        $group += (ord($num[$i]) - 48) * 100;
        $group += (ord($num[$i + 1]) - 48) * 10;
        $group += (ord($num[$i + 2]) - 48);
        $gSum += $group;
    }
     
    // calculate result till 3 digit sum
    if ($gSum > 1000)
    {
        $num = strval($gSum);
        $n = strlen($num);
        $gSum = isDivisible999($num);
    }
    return ($gSum == 999);
}
 
// Driver Code
$num = "1998";
if (isDivisible999($num))
    echo "Divisible";
else
    echo "Not divisible";
 
// This code is contributed by mits
?>

Javascript

<script>
// Javascript for divisibility of number by 999
 
// function to check divisibility
function isDivisible999(num)
{
    let n = num.length;
    if (n == 0 && num[0] == '0')
    return true;
 
    // Append required 0s at the beginning.
    if (n % 3 == 1)
        num = "00" + num;
    if (n % 3 == 2)
        num = "0" + num;
 
    // add digits in group of three in gSum
    let gSum = 0;
    for (let i = 0; i < n; i += 3)
    {
        // group saves 3-digit group
        group = 0;
        group += (num.charCodeAt(i) - 48) * 100;
        group += (num.charCodeAt(i + 1) - 48) * 10;
        group += (num.charCodeAt(i + 2) - 48);
        gSum += group;
    }
     
    // calculate result till 3 digit sum
    if (gSum > 1000)
    {
        num = String(gSum);
        n = strlen(num);
        gSum = isDivisible999(num);
    }
    return (gSum == 999);
}
 
// Driver Code
let num = "1998";
if (isDivisible999(num))
    document.write("Divisible");
else
    document.write("Not divisible");
 
// This code is contributed by _saurabh_jaiswal.
</script>
Producción

Divisible

Complejidad temporal : O(n) 
Espacio auxiliar : O(1)

Método: Comprobación de que cualquier número dado es divisible por 999 o no mediante el operador de división de módulo «%».  

Implementación:

Python3

# Python code
# To check whether the given number is divisible by 999 or not
 
#input
n=235764
# the above input can also be given as n=input() -> taking input from user
# finding given number is divisible by 999 or not
if int(n)%999==0:
  print("Yes")
else:
  print("No")
   
  # this code is contributed by gangarajula laxmi

Javascript

<script>
        // JavaScript code for the above approach
        //input
        let n = 235764
        // the above input can also be given as n=input() -> taking input from user
        // finding given number is divisible by 999 or not
        if (n % 999 == 0)
            document.write("Yes")
        else
            document.write("No")
    // This code is contributed by Potta Lokesh
    </script>
Producción

Yes

Complejidad de tiempo: O(log(n)) , para números pequeños.

Para números enteros grandes, la división de Python (y el módulo) usan un algoritmo O(n^2). La multiplicación usa la multiplicación de Karatsuba que es O(n^1.585) pero la división usa la división básica de «escuela primaria».

Espacio Auxiliar : O(1)

Más algoritmos de divisibilidad .
Este artículo es una contribución de Shivam Pradhan (anuj_charm) . 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. 

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 *