logo

Verifique se um número grande é divisível por 16 ou não

Dado um número, a tarefa é verificar se um número é divisível por 16 ou não. O número de entrada pode ser grande e pode não ser possível armazená-lo, mesmo se usarmos long long int.

Exemplos: 

Input : n = 1128 Output : No Input : n = 11216 Output : Yes Input : n = 1124273542764284287 Output : No

Como o número de entrada pode ser muito grande, não podemos usar n % 16 para verificar se um número é divisível por 16 ou não, especialmente em linguagens como C/C++. A ideia é baseada no seguinte fato. 



string comparar com java
A number is divisible by 16 if number formed by last four digits of it is divisible by 16.


Ilustração:  

For example let us consider 769616 Number formed by last four digits = 9616 Since 9522 is divisible by 16 answer is YES.


Como é que isso funciona?  

Let us consider 76952 we can write it as 76942 = 7*10000 + 6*1000 + 9*100 + 5*10 + 2 The proof is based on below observation: Remainder of 10i divided by 16 is 0 if i greater than or equal to four. Note that 10000 100000... etc lead to remainder 0 when divided by 16. So remainder of '7*10000 + 6*1000 + 9*100 + 5*10 + 2' divided by 16 is equivalent to remainder of following : 0 + 6*1000 + 9*100 + 5*10 + 2 = 6952 Therefore we can say that the whole number is divisible by 16 if 6952 is divisible by 16.
C++
// C++ program to find if a number // is divisible by 16 or not #include   using namespace std; // Function to find that // number divisible by 16 or not bool check(string str) {  int n = str.length();  // Empty string  if (n == 0 && n == 1)  return false;  // If there is double digit  if (n == 2)  return (((str[n-2]-'0')*10 +  (str[n-1]-'0'))%16 == 0);  // If there is triple digit  if(n == 3)  return ( ((str[n-3]-'0')*100 +  (str[n-2]-'0')*10 +  (str[n-1]-'0'))%16 == 0);  // If number formed by last four  // digits is divisible by 16.  int last = str[n-1] - '0';  int second_last = str[n-2] - '0';  int third_last = str[n-3] - '0';  int fourth_last = str[n-4] - '0';  return ((fourth_last*1000 + third_last*100 +  second_last*10 + last) % 16 == 0); } // Driver code int main() {  string str = '769528';  check(str)? cout << 'Yes' : cout << 'No ';  return 0; } 
Java
// Java program to find if a number // is divisible by 16 or not import java.io.*; class GFG {  // Function to find that  // number divisible by 16 or not  static boolean check(String str)  {  int n = str.length();    // Empty string  if (n == 0 && n == 1)  return false;    // If there is double digit  if (n == 2)  return (((str.charAt(n-2)-'0')*10 +  (str.charAt(n-1)-'0'))%16 == 0);    // If there is triple digit  if(n == 3)  return ( ((str.charAt(n-3)-'0')*100 +  (str.charAt(n-2)-'0')*10 +  (str.charAt(n-1)-'0'))%16 == 0);      // If number formed by last  // four digits is divisible by 16.  int last = str.charAt(n-1) - '0';  int second_last = str.charAt(n-2) - '0';  int third_last = str.charAt(n-3) - '0';  int fourth_last = str.charAt(n-4) - '0';  return ((fourth_last*1000 + third_last*100   + second_last*10 + last) % 16 == 0);  }    // Driver code  public static void main(String args[])  {  String str = '769528';  if(check(str))  System.out.println('Yes');  else  System.out.println('No ');  } } // This code is contributed by Nikita Tiwari. 
Python3
# Python 3 program to find # if a number is divisible # by 16 or not # Function to find that # number divisible by # 16 or not def check(st) : n = len(st) # Empty string if (n == 0 and n == 1) : return False # If there is double digit if (n == 2) : return ((int)(st[n-2])*10 + ((int)(st[n-1])%16 == 0)) # If there is triple digit if(n == 3) : return ( ((int)(st[n-3])*100 + (int)(st[n-2])*10 + (int)(st[n-1]))%16 == 0) # If number formed by last # four digits is divisible # by 16. last = (int)(st[n-1]) second_last = (int)(st[n-2]) third_last = (int)(st[n-3]) fourth_last = (int)(st[n-4]) return ((fourth_last*1000 + third_last*100 + second_last*10 + last) % 16 == 0) # Driver code st = '769528' if(check(st)) : print('Yes') else : print('No') # This code is contributed by Nikita Tiwari. 
C#
// C# program to find if a number // is divisible by 16 or not using System; class GFG {    // Function to find that number   // divisible by 16 or not  static bool check(String str)  {  int n = str.Length;    // Empty string  if (n == 0 && n == 1)  return false;    // If there is double digit  if (n == 2)  return (((str[n - 2] - '0') * 10 +  (str[n - 1] - '0')) % 16 == 0);    // If there is triple digit  if(n == 3)  return (((str[n - 3] - '0') * 100 +  (str[n - 2] - '0') * 10 +  (str[n - 1] - '0')) % 16 == 0);      // If number formed by last  // four digits is divisible by 16.  int last = str[n - 1] - '0';  int second_last = str[n - 2] - '0';  int third_last = str[n - 3] - '0';  int fourth_last = str[n - 4] - '0';  return ((fourth_last * 1000 + third_last * 100  + second_last * 10 + last) % 16 == 0);  }    // Driver code  public static void Main()  {  String str = '769528';  if(check(str))  Console.Write('Yes');  else  Console.Write('No ');  } } // This code is contributed by Nitin Mittal. 
PHP
 // PHP program to find if a number // is divisible by 16 or not // Function to find that // number divisible by 16 or not function check($str) { $n = strlen($str); // Empty string if ($n == 0 && $n == 1) return false; // If there is double digit if ($n == 2) return ((($str[$n - 2] - '0') * 10 + ($str[$n - 1] - '0')) % 16 == 0); // If there is triple digit if($n == 3) return ((($str[$n -3] - '0') * 100 + ($str[$n - 2] - '0') * 10 + ($str[$n - 1] - '0')) % 16 == 0); // If number formed by last four // digits is divisible by 16. $last = $str[$n - 1] - '0'; $second_last = $str[$n - 2] - '0'; $third_last = $str[$n - 3] - '0'; $fourth_last = $str[$n - 4] - '0'; return (($fourth_last * 1000 + $third_last * 100 + $second_last * 10 + $last) % 16 == 0); } // Driver code $str = '769528'; $x = check($str) ? 'Yes' : 'No '; echo($x); // This code is contributed by Ajit. ?> 
JavaScript
<script> // Javascript program to find if a number // is divisible by 16 or not // Function to find that number  // divisible by 16 or not function check(str) {  let n = str.length;    // Empty string  if (n == 0 && n == 1)  return false;    // If there is double digit  if (n == 2)  return (((str[n - 2] - '0') * 10 +  (str[n - 1] - '0')) % 16 == 0);    // If there is triple digit  if(n == 3)  return (((str[n - 3] - '0') * 100 +  (str[n - 2] - '0') * 10 +  (str[n - 1] - '0')) % 16 == 0);    // If number formed by last  // four digits is divisible by 16.  let last = str[n - 1] - '0';  let second_last = str[n - 2] - '0';  let third_last = str[n - 3] - '0';  let fourth_last = str[n - 4] - '0';    return ((fourth_last * 1000 + third_last * 100 +   second_last * 10 + last) % 16 == 0); } // Driver code let str = '769528'; if (check(str))  document.write('Yes'); else  document.write('No ');   // This code is contributed by decode2207 </script> 

Saída: 

No

Complexidade de tempo: O(1)
Espaço Auxiliar: O(1)

Outra abordagem (usando o operador AND bit a bit):

como usar o ambiente de trabalho mysql

Para verificar se um número grande é divisível por 16 ou não sem usar o operador módulo podemos verificar os últimos 4 bits do número. Se todos esses bits forem 0, o número será divisível por 16, caso contrário não será.

Isso ocorre porque 16 é representado em binário como 0b10000, o que significa que tem 1 na posição do 5º bit e todos os 0 nos 4 bits inferiores. Portanto, se um número for divisível por 16, ele deverá ter todos os 0 nos 4 bits inferiores.

Abaixo está a implementação da abordagem acima:

C++
#include    using namespace std; // Function to check if a number is divisible by 16 bool is_divisible_by_16(int num) {  int last_four_bits = num & 0b1111; // bitwise AND with 0b1111 to get the last 4 bits  return last_four_bits == 0; // check if all 4 bits are 0's } int main() {  int num = 769528;  if (is_divisible_by_16(num)) {  cout << 'Yes' << endl;  } else {  cout << 'No' << endl;  }  return 0; } 
Java
import java.io.*; public class Gfg {  // Function to check if a number is divisible by 16  static boolean is_divisible_by_16(int num) {  int lastFourBits = num & 0b1111; // bitwise AND with 0b1111 to get the last 4 bits  return lastFourBits == 0; // check if all 4 bits are 0's  }  public static void main(String[] args) {  int num = 769528;  if (is_divisible_by_16(num)) {  System.out.println('Yes');  } else {  System.out.println('No');  }  } } 
Python3
def is_divisible_by_16(num): last_four_bits = num & 0b1111 # bitwise AND with 0b1111 to get the last 4 bits return last_four_bits == 0 # check if all 4 bits are 0's num = 769528 if(is_divisible_by_16(num)): print('Yes') else: print('No') 
C#
using System; class MainClass {  static bool IsDivisibleBy16(int num) {  int lastFourBits = num & 0b1111; // bitwise AND with 0b1111 to get the last 4 bits  return lastFourBits == 0; // check if all 4 bits are 0's  }  public static void Main (string[] args) {  int num = 769528;  if (IsDivisibleBy16(num)) {  Console.WriteLine('Yes');  } else {  Console.WriteLine('No');  }  } } 
JavaScript
function is_divisible_by_16(num) {  let last_four_bits = num & 0b1111; // bitwise AND with 0b1111 to get the last 4 bits  return last_four_bits === 0; // check if all 4 bits are 0's } let num = 769528; if (is_divisible_by_16(num)) {  console.log('Yes'); } else {  console.log('No'); } 

Saída
No

Complexidade de tempo: O(1)

Espaço Auxiliar: O(1)

Neste código, usamos o operador AND bit a bit & com o número binário 0b1111 (que tem todos os 1 nos 4 bits inferiores e 0 nos bits superiores) para extrair os últimos 4 bits do número de entrada num. Então verificamos se esses 4 bits são todos 0 ou não. Se todos forem 0, a função retornará True (significando que o número é divisível por 16), caso contrário, retornará False.


 

Criar questionário