问题是检查给定二进制数的十进制表示形式是否可被20整除。请注意,该数字可能非常大,即使int long int也可能不适合。该方法应使得乘法和除法运算的数目为零或最少。输入中没有前导0。
例子 :
Input : 101000
Output : Yes
(10100)2 = (40)10
and 40 is divisible by 20.
Input : 110001110011100
Output : Yes
方法:以下是步骤:
- 令二进制字符串为bin [] 。
- 令bin []的长度为n 。
- 如果bin [n-1] ==’1’,则它是一个奇数,因此不能被20整除。
- 否则检查bin [0..n-2]是否可被10整除。请参阅此文章。
C++
// C++ implementation to check whether
// decimal representation of given binary
// number is divisible by 20 or not
#include
using namespace std;
// function to check whether decimal
// representation of given binary number
// is divisible by 10 or not
bool isDivisibleBy10(char bin[], int n)
{
// 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;
}
// function to check whether decimal
// representation of given binary number
// is divisible by 20 or not
bool isDivisibleBy20(char bin[], int n)
{
// if 'bin' is an odd number
if (bin[n - 1] == '1')
return false;
// check if bin(0..n-2) is divisible
// by 10 or not
return isDivisibleBy10(bin, n - 1);
}
// Driver program to test above
int main()
{
char bin[] = "101000";
int n = sizeof(bin) / sizeof(bin[0]);
if (isDivisibleBy20(bin, n - 1))
cout << "Yes";
else
cout << "No";
return 0;
}
Java
// Java implementation to check whether
// decimal representation of given binary
// number is divisible by 20 or not
import java.io.*;
class GFG {
// function to check whether decimal
// representation of given binary number
// is divisible by 10 or not
static boolean isDivisibleBy10(char bin[], int n)
{
// 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;
}
// function to check whether decimal
// representation of given binary number
// is divisible by 20 or not
static boolean isDivisibleBy20(char bin[], int n)
{
// if 'bin' is an odd number
if (bin[n - 1] == '1')
return false;
// check if bin(0..n-2) is divisible
// by 10 or not
return isDivisibleBy10(bin, n - 1);
}
// Driver program to test above
public static void main(String args[])
{
char bin[] = "101000".toCharArray();
int n = bin.length;
if (isDivisibleBy20(bin, n - 1))
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code is contributed
// by Nikita Tiwari.
Python3
# Python 3 implementation to check whether
# decimal representation of given binary
# number is divisible by 20 or not
# function to check whether decimal
# representation of given binary number
# is divisible by 10 or not
def isDivisibleBy10(bin, n):
# 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'
for i in range(n - 2, -1, -1):
# 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
# if last digit is 0, then
# divisible by 10
if (sum % 10 == 0):
return True
# not divisible by 10
return False
# function to check whether decimal
# representation of given binary number
# is divisible by 20 or not
def isDivisibleBy20(bin, n):
# if 'bin' is an odd number
if (bin[n - 1] == '1'):
return false
# check if bin(0..n-2) is divisible
# by 10 or not
return isDivisibleBy10(bin, n - 1)
# Driver program to test above
bin = ['1','0','1','0','0','0']
n = len(bin)
if (isDivisibleBy20(bin, n - 1)):
print("Yes")
else:
print("No")
# This code is contributed by Smitha Dinesh Semwal
C#
// C# implementation to check whether
// decimal representation of given binary
// number is divisible by 20 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)
{
// 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;
}
// function to check whether decimal
// representation of given binary number
// is divisible by 20 or not
static bool isDivisibleBy20(string bin, int n)
{
// if 'bin' is an odd number
if (bin[n - 1] == '1')
return false;
// check if bin(0..n-2) is divisible
// by 10 or not
return isDivisibleBy10(bin, n - 1);
}
// Driver program to test above
public static void Main()
{
string bin = "101000";
int n = bin.Length;
if (isDivisibleBy20(bin, n - 1))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed
// by vt_m.
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;
}
// function to check whether decimal
// representation of given binary number
// is divisible by 20 or not
function isDivisibleBy20($bin, $n)
{
// if 'bin' is an odd number
if ($bin[$n - 1] == '1')
return false;
// check if bin(0..n-2) is divisible
// by 10 or not
return isDivisibleBy10($bin, $n - 1);
}
// Driver code
$bin= "101000";
$n = strlen($bin);
if (isDivisibleBy20($bin, $n - 1))
echo "Yes";
else
echo "No";
// This code is contributed by mits
?>
输出 :
Yes
时间复杂度:O(n),其中n是二进制数中的位数。