Как проверить, можно ли разделить двоичное число на 10 (десятичное), не переводя его в другую систему. Например, у нас есть номер:
1010 1011 0100 0001 0000 0100
Как проверить, что это число делится на 10?
Как проверить, можно ли разделить двоичное число на 10 (десятичное), не переводя его в другую систему. Например, у нас есть номер:
1010 1011 0100 0001 0000 0100
Как проверить, что это число делится на 10?
Сначала разделите число на нечетные и четные биты (я называю «четными» биты, соответствующие четным степеням числа 2):
100100110010110000000101101110 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 четный 1 0 0 1 0 1 1 0 0 0 0 0 1 1 1 нечетный
Теперь в каждом из них поочередно складываем и вычитаем цифры, как в стандартном тесте на делимость на 11 в десятичной дроби (начиная со сложения справа):
100100110010110000000101101110 +0-1+0-1+0-0+1-0+0-0+1-1+0-1+0 = -2 +1-0+0-1+0-1+1-0+0-0+0-0+1-1+1 = 1
Теперь удвойте сумму нечетных цифр и прибавьте ее к сумме четных цифр:
2*1 + -2 = 0
Если результат делится на 5, как в этом случае, само число делится на 5.
Поскольку это число также делится на 2 (самая правая цифра — 0), оно делится и на 10.
http://mathforum.org/library/drmath/view/55908.html
Если вы говорите о вычислительных методах, вы можете выполнить тест на делимость на 5 и тест на делимость на 2.
Приведенные ниже числа предполагают беззнаковую 32-битную арифметику, но могут быть легко расширены до больших чисел.
Сначала я приведу код, а затем более текстовое объяснение:
unsigned int div5exact(unsigned int n)
{
// returns n/5 as long as n actually divides 5
// (because 'n * (INV5 * 5)' == 'n * 1' mod 2^32
#define INV5 0xcccccccd
return n * INV5;
}
unsigned int divides5(unsigned int n)
{
unsigned int q = div5exact(n);
if (q <= 0x33333333) /* q*5 < 2^32? */
{
/* q*5 doesn't overflow, so n == q*5 */
return 1;
}
else
{
/* q*5 overflows, so n != q*5 */
return 0;
}
}
int divides2(unsigned int n)
{
/* easy divisibility by 2 test */
return (n & 1) == 0;
}
int divides10(unsigned int n)
{
return divides2(n) && divides5(n);
}
/* fast one-liner: */
#define DIVIDES10(n) ( ((n) & 1) == 0 && ((n) * 0xcccccccd) <= 0x33333333 )
Делимость на 2 проста: (n&1) == 0 означает, что n четно.
Делимость на 5 предполагает умножение на число, обратное 5, которое равно 0xcccccccd (потому что 0xcccccccd * 5 == 0x400000001, что равно 0x1, если вы усекаете до 32 бит).
При умножении n*5 на обратное 5, вы получите n * 5*(обратное 5), что в 32-битной математике упрощается до n*1 .
Теперь предположим, что n и q — 32-битные числа, и q = n*(обратно 5) по модулю 232< /em>.
Поскольку n не больше 0xffffffff, мы знаем, что n/5 не больше, чем (232 sup>-1)/5 (0x33333333). Следовательно, мы знаем, что если q меньше или равно (232-1)/5, то мы знаем n< /em> делит точно на 5, потому что q * 5 не усекается до 32 бит и поэтому равно n, поэтому n делит q и 5.
Если q больше, чем (232-1)/5, мы знаем, что оно не делит 5, потому что есть единица -одно сопоставление между 32-битными числами, делящимися на 5, и числами от 0 до (232-1)/5, поэтому любое число вне этого диапазона не не сопоставляется с числом, которое делится на 5.
Вот код на Python для проверки делимости на 10 с использованием побитовой техники
#taking input in string which is a binary number eg: 1010,1110
s = input()
#taking initial value of x as o
x = 0
for i in s:
if i == '1':
x = (x*2 + 1) % 10
else:
x = x*2 % 10
#if x is turn to be 0 then it is divisible by 10
if x:
print("Not divisible by 10")
else:
print("Divisible by 10")
x
делится наy
, означает, что существует некоторое целое числоm
такое, чтоym = x
то есть оно делится без остатка - так что это вовсе не было двусмысленно. Я могу понять, как это может сбивать с толку, поскольку мы все время выполняем деление неделимых чисел, т. Е. Мы получаем результат с остатком / десятичной дробью, что не имеет смысла, если вы осторожны с определением слова «делимый». - person gbtimmon   schedule 10.09.2012