1

如何检查二进制数是否可以除以 10(十进制),而不将其转换为其他系统。例如,我们有一个数字:

1010 1011 0100 0001 0000 0100

我们如何检查这个数字是否能被 10 整除?

4

3 回答 3

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

于 2012-09-10T17:17:30.320 回答
1

如果您在谈论计算方法,则可以进行 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,如果截断为 32 位,则仅为 0x1)。
当你将n*5乘以 5的倒数时,你会得到n * 5*(inverse of 5),这在 32 位数学中简化为n*1

现在假设nq是 32 位数字,并且q = n*(inverse of 5) mod 2 32
因为n不大于0xffffffff,所以我们知道n/5不大于(2 32 -1)/5(即0x33333333)。因此,我们知道如果q小于或等于(2 32 -1)/5,那么我们知道n正好除以 5,因为q * 5不会被截断为 32 位,因此等于n,所以n除以q和 5。

如果q大于(2 32 -1)/5,那么我们知道它不能整除 5,因为在可被 5 整除的 32 位数字与 0 和(2 32 -1)/5,因此超出此范围的任何数字都不会映射到可被 5 整除的数字。

于 2013-02-11T03:51:45.577 回答
0

这是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")
于 2018-12-21T13:51:06.343 回答