Двоичная делимость на 10

Как проверить, можно ли разделить двоичное число на 10 (десятичное), не переводя его в другую систему. Например, у нас есть номер:

1010 1011 0100 0001 0000 0100

Как проверить, что это число делится на 10?


person Patryk Wychowaniec    schedule 10.09.2012    source источник
comment
Вы имеете в виду 10 десятичных или 10 двоичных?   -  person Eric J.    schedule 10.09.2012
comment
Каждое число (излучающее 0) делится на 10   -  person asawyer    schedule 10.09.2012
comment
10 десятичных. Я забыл упомянуть об этом в посте. Изменить: сообщение отредактировано.   -  person Patryk Wychowaniec    schedule 10.09.2012
comment
@asawyer: 0 также делится на 10. 0/10 = 0. Наоборот, 0/10 не определено. Конечно, чаще всего результатом деления является не целое число :-)   -  person Eric J.    schedule 10.09.2012
comment
@ЭрикДж. Я пытался понять, что вопрос сформулирован двусмысленно.   -  person asawyer    schedule 10.09.2012
comment
@asawyer на самом деле, строгое математическое определение того, что x делится на y, означает, что существует некоторое целое число m такое, что ym = x то есть оно делится без остатка - так что это вовсе не было двусмысленно. Я могу понять, как это может сбивать с толку, поскольку мы все время выполняем деление неделимых чисел, т. Е. Мы получаем результат с остатком / десятичной дробью, что не имеет смысла, если вы осторожны с определением слова «делимый».   -  person gbtimmon    schedule 10.09.2012
comment
@Wooble: Думаю, я слишком давно не посещал уроки математики. Забыл, что делимое имеет строгое определение в математике (делится нацело без остатка, dictionary.reference.com/browse/divisible?s=t)   -  person Eric J.    schedule 10.09.2012


Ответы (3)


Сначала разделите число на нечетные и четные биты (я называю «четными» биты, соответствующие четным степеням числа 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

person Eric J.    schedule 10.09.2012
comment
Я нашел это; Я думал, что кто-то нашел более простое решение, поэтому я создал этот вопрос. В любом случае, спасибо ;) - person Patryk Wychowaniec; 10.09.2012

Если вы говорите о вычислительных методах, вы можете выполнить тест на делимость на 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-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.

person mwfearnley    schedule 11.02.2013

Вот код на 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")
person Rahul    schedule 21.12.2018