【问题标题】:How to check if a number is a multiple of 6?如何判断一个数是否是6的倍数?
【发布时间】:2012-04-01 16:16:26
【问题描述】:

我想要一个只使用移位、加法或减法运算来确定一个数字是否是 6 的倍数的算法。所以,基本上只是二进制运算。

到目前为止,我认为我应该将数字右移两次以除以 4,然后从中减去 6 一次。但我知道我的方法有问题,无法弄清楚是什么。

【问题讨论】:

  • 您可以继续从数字中减去 6,然后看到它变为零。如果结果小于零,则它不能被 6 整除
  • 效率不高,但您可以仅使用减法来实现模函数。
  • 如果在实际程序中使用:不要这样做。只需使用num % 6,让编译器找出最快的方法。很可能,简单地使用 CPU 的 mod 操作将比您想出的任何 bit-hacks 更快。

标签: algorithm binary


【解决方案1】:
Reference: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_6

It is a multiple of six if BOTH of the following statements are true:
1) The last digit (ones place) is 0, 2, 4, 6, or 8.
2) When you add all the digits together, you get a multiple of 3.


Reference: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_3

1) Start with a number N. 
2) Sum the digits of the number, and get M. 
3) If M is larger than 10, set N=M and return to stage 2.
4) Otherwise, M is now smaller than 10. If M is 0,3,6 or 9, then N is a multiple of 3

【讨论】:

  • 现在解释一下,如何在不使用除法的情况下将所有数字相加?
  • 老兄,如果不使用 mod 或 div 或将其转换为字符串,您如何将所有数字相加?
【解决方案2】:

您可以尝试使用可用的原始操作来实现除法算法。从四年级开始的基本长除法算法可能就足够了(只需以 2 为底而不是以 10 为底,用位移而不是乘法)

【讨论】:

    【解决方案3】:

    1) 简单的(N & 1) == 0 检查数字是否可以被 2 整除。

    2) 使用 Bit hack 答案(来自 This 线程。)检查是否可被 3 整除。

    如果两者都为真,则您的数字可以被 6 整除。

    【讨论】:

    • 嗯。打败我一分钟,但我直接链接到the hack。 :^)
    【解决方案4】:

    如何继续将数字减去 6 直到它达到零。 如果你得到零,这个数字可以被 6 整除,否则不能。 要么 继续将数字除以 2(二进制移位操作),直到数字小于 12。 然后从中减去 6。如果小于零(不可整除) 如果零整除。 如果不减 3 如果小于零(不可整除) 如果零整除。

    【讨论】:

      【解决方案5】:

      好的。这就是我将如何去做(只是第一个想法):

      6的倍数是2和3的倍数,所以应该同时满足2和3的整除条件...所以...

      • 检查被 2 整除

        1. 数字右移
        2. 如果余数>1,则重复 1。
        3. 如果余数=1,则为 FALSE,否则继续。

          检查除以 2,显然也可以通过 (N & 1 == 0) 来实现,如上所述。这只是检查 N 的二进制表示的最后一位:如果它是 1,N 是奇数(因此不能被 2 整除),如果它是 0,它完全可以整除...

      • 检查可被 3 整除
        1. 减去 3。
        2. 如果余数>3,重复 1。
        3. 如果余数>0,则为 FALSE,否则为 TRUE。

      【讨论】:

        【解决方案6】:

        如果我们将操作范围扩展到“位掩码”和“位移位”,就很简单了。

        正如很多人所说,被二整除等同于(n & 1) == 0。在二进制中被 3 整除(相对)容易。将累加器 a 初始化为 0,然后重复 a += (n & 3); n = (n >> 2); 直到 n 为 0。如果(且仅当)a 为 3,n 可以被 3 整除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 2023-03-12
          • 2010-10-19
          • 2011-05-24
          相关资源
          最近更新 更多