【问题标题】:Binary divisibility by 10二进制可被 10 整除
【发布时间】:2018-12-21 21:58:06
【问题描述】:

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

1010 1011 0100 0001 0000 0100

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

【问题讨论】:

  • 你是指十进制的 10 位还是二进制的 10 位?
  • 每个数字(散发出 0)都可以被 10 整除
  • 十进制。我忘了在帖子里提到它。编辑:帖子已编辑。
  • @EricJ。我试图理解的是这个问题的措辞模棱两可。
  • @asawyer 实际上,x 可被y 整除的严格数学定义意味着存在一些整数m 使得ym = x 被除以无余数——所以它一点也不模棱两可。我可以理解它是如何令人困惑的,因为我们一直在对不可分割的数字进行除法,即我们得到一个带有余数/小数的结果——如果你对可分割这个词的定义小心的话,这是没有意义的。

标签: binary division


【解决方案1】:

首先将数字分成奇数位和偶数位(我称“偶数”为 对应于 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

【讨论】:

  • 我找到了这个;我认为有人找到了更简单的解决方案,这就是我提出这个问题的原因。无论如何,谢谢;)
【解决方案2】:

如果您谈论的是计算方法,您可以进行 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*(5 的倒数),这在 32 位数学中简化为 n *1 .

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

如果 q 大于 (232-1)/5,那么我们知道它不能整除 5,因为有是可被 5 整除的 32 位数字与 0 和 (232-1)/5 之间的数字之间的一对一映射,因此任何数字此范围不映射到可被 5 整除的数字。

【讨论】:

    【解决方案3】:

    这是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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 2016-04-01
      • 2014-03-20
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多