📌  相关文章
📜  给定二进制字符串的十进制表示是否可以被10整除

📅  最后修改于: 2021-04-29 02:00:30             🧑  作者: Mango

问题是检查给定二进制数的十进制表示形式是否可被10整除。请注意,该数字可能非常大,即使int long int也可能不适合。该方法应使得乘法和除法运算的数目为零或最少。输入中没有前导0。

例子:

Input : 101000
Output : Yes
(101000)2 = (40)10
and 40 is divisible by 10.

Input : 11000111001110
Output : Yes

方法:首先,我们需要知道pow(2,i)的最后一位= 2、4、8、6,如果i%4分别等于1、2、3、0,其中i大于等于1.因此,在二进制表示形式中,我们需要从右边知道数字“ 1”的位置,以便知道要与之相乘的2的幂。这将帮助我们获得所需的2的理想幂的最后一位。我们可以将这些数字相加,然后检查和的最后一位是否为0,这意味着该数字可以被10整除。请注意,如果二进制表示形式的最后一位数字为“ 1”,则它表示一个奇数,因此不能被10整除。

C++
// C++ implementation to check whether decimal
// representation of given binary number is 
// divisible by 10 or not
#include 
using namespace std;
  
// function to check whether decimal representation 
// of given binary number is divisible by 10 or not
bool isDivisibleBy10(string bin)
{
    int n = bin.size();
      
    // if last digit is '1', then
    // number is not divisible by 10
    if (bin[n-1] == '1')
        return false;
      
    // to accumulate the sum of last digits
    // in perfect powers of 2
    int sum = 0;
      
    // traverse from the 2nd last up to 1st digit
    // in 'bin'
    for (int i=n-2; i>=0; i--)    
    {
        // if digit in '1'
        if (bin[i] == '1')
        {
            // calculate digit's position from
            // the right
            int posFromRight = n - i - 1;
              
            // according to the digit's position, 
            // obtain the last digit of the applicable 
            // perfect power of 2
            if (posFromRight % 4 == 1)
                sum = sum + 2;
            else if (posFromRight % 4 == 2)
                sum = sum + 4;
            else if (posFromRight % 4 == 3)
                sum = sum + 8;
            else if (posFromRight % 4 == 0)
                sum = sum + 6;            
        }
    }
      
    // if last digit is 0, then
    // divisible by 10
    if (sum % 10 == 0)
        return true;
      
    // not divisible by 10    
    return false;    
}
  
// Driver program to test above
int main()
{
    string bin = "11000111001110";
      
    if (isDivisibleBy10(bin))
        cout << "Yes";
    else
        cout << "No";    
          
    return 0;
}


Java
// Java implementation to check whether decimal
// representation of given binary number is 
// divisible by 10 or not
import java.util.*;
  
class GFG {
      
    // function to check whether decimal 
    // representation of given binary number
    // is divisible by 10 or not
    static boolean isDivisibleBy10(String bin)
    {
        int n = bin.length();
           
        // if last digit is '1', then
        // number is not divisible by 10
        if (bin.charAt(n - 1) == '1')
            return false;
           
        // to accumulate the sum of last 
        // digits in perfect powers of 2
        int sum = 0;
           
        // traverse from the 2nd last up to
        // 1st digit in 'bin'
        for (int i = n - 2; i >= 0; i--)    
        {
            // if digit in '1'
            if (bin.charAt(i) == '1')
            {
                // calculate digit's position
                // from the right
                int posFromRight = n - i - 1;
                   
                // according to the digit's 
                // position, obtain the last 
                // digit of the applicable 
                // perfect power of 2
                if (posFromRight % 4 == 1)
                    sum = sum + 2;
                else if (posFromRight % 4 == 2)
                    sum = sum + 4;
                else if (posFromRight % 4 == 3)
                    sum = sum + 8;
                else if (posFromRight % 4 == 0)
                    sum = sum + 6;            
            }
        }
           
        // if last digit is 0, then
        // divisible by 10
        if (sum % 10 == 0)
            return true;
           
        // not divisible by 10    
        return false;    
    }
      
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        String bin = "11000111001110";
           
        if (isDivisibleBy10(bin))
            System.out.print("Yes");
        else
            System.out.print("No");   
          
        }
    }
  
// This code is contributed by Arnav Kr. Mandal.


Python
# Python implementation to check whether
# decimal representation of given binary
# number is divisible by 10 or not
  
  
# function to check whether decimal 
# representation of given binary number
# is divisible by 10 or not
def isDivisibleBy10(bin) :
    n = len(bin)
      
    #if last digit is '1', then
    # number is not divisible by 10
    if (bin[n - 1] == '1') :
        return False
          
    # to accumulate the sum of last 
    # digits in perfect powers of 2
    sum = 0
      
    #traverse from the 2nd last up to
    # 1st digit in 'bin'
      
    i = n - 2
    while i >= 0 :
          
        # if digit in '1'
        if (bin[i] == '1') :
            # calculate digit's position
            # from the right
            posFromRight = n - i - 1
              
            #according to the digit's 
            # position, obtain the last 
            # digit of the applicable 
            # perfect power of 2
            if (posFromRight % 4 == 1) :
                sum = sum + 2
            elif (posFromRight % 4 == 2) :
                sum = sum + 4
            elif (posFromRight % 4 == 3) :
                sum = sum + 8
            elif (posFromRight % 4 == 0) :
                sum = sum + 6
              
        i = i - 1
          
    # if last digit is 0, then
    # divisible by 10
    if (sum % 10 == 0) :
        return True
          
    # not divisible by 10 
    return False
          
  
# Driver program to test above function
  
bin = "11000111001110"
if (isDivisibleBy10(bin)== True) :
    print("Yes")
else :
    print("No")
  
# This code is contributed by Nikita Tiwari.


C#
// C# implementation to check whether decimal
// representation of given binary number is
// divisible by 10 or not
using System;
  
class GFG {
  
    // function to check whether decimal
    // representation of given binary number
    // is divisible by 10 or not
    static bool isDivisibleBy10(String bin)
    {
        int n = bin.Length;
  
        // if last digit is '1', then
        // number is not divisible by 10
        if (bin[n - 1] == '1')
            return false;
  
        // to accumulate the sum of last
        // digits in perfect powers of 2
        int sum = 0;
  
        // traverse from the 2nd last up to
        // 1st digit in 'bin'
        for (int i = n - 2; i >= 0; i--) {
              
            // if digit in '1'
            if (bin[i] == '1') {
                  
                // calculate digit's position
                // from the right
                int posFromRight = n - i - 1;
  
                // according to the digit's
                // position, obtain the last
                // digit of the applicable
                // perfect power of 2
                if (posFromRight % 4 == 1)
                    sum = sum + 2;
                else if (posFromRight % 4 == 2)
                    sum = sum + 4;
                else if (posFromRight % 4 == 3)
                    sum = sum + 8;
                else if (posFromRight % 4 == 0)
                    sum = sum + 6;
            }
        }
  
        // if last digit is 0, then
        // divisible by 10
        if (sum % 10 == 0)
            return true;
  
        // not divisible by 10
        return false;
    }
  
    /* Driver program to test above function */
    public static void Main()
    {
        String bin = "11000111001110";
  
        if (isDivisibleBy10(bin))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
  
// This code is contributed by Sam007


PHP
= 0; $i--) 
    {
        // if digit in '1'
        if ($bin[$i] == '1')
        {
            // calculate digit's 
            // position from the right
            $posFromRight = $n - $i - 1;
              
            // according to the digit's 
            // position, obtain the last 
            // digit of the applicable 
            // perfect power of 2
            if ($posFromRight % 4 == 1)
                $sum = $sum + 2;
            else if ($posFromRight % 4 == 2)
                $sum = $sum + 4;
            else if ($posFromRight % 4 == 3)
                $sum = $sum + 8;
            else if ($posFromRight % 4 == 0)
                $sum = $sum + 6;         
        }
    }
      
    // if last digit is 0, then
    // divisible by 10
    if ($sum % 10 == 0)
        return true;
      
    // not divisible by 10 
    return false; 
}
  
// Driver Code
$bin = "11000111001110";
if(isDivisibleBy10($bin))
    echo "Yes";
else
    echo "No";
  
// This code is contributed by mits. 
?>


输出:

Yes

时间复杂度: O(n),其中n是二进制数中的位数。