2012-03-16 91 views
1

我想要一个算法,只使用移位,加或减操作来查找一个数是否是6的倍数。所以,基本上只是二元运算。如何检查数字是否是6的倍数?

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

+0

ň整除你可以保持从数减去6,看到它得到为零。如果结果小于零,那么它不能被6 – 2012-03-16 04:31:34

+0

整除效率不高,但可以仅使用减法实现模函数。 – st0le 2012-03-16 04:31:40

+1

如果这是在真正的程序中使用:不要这样做。只需使用'num%6',让编译器找出最快的方法。更有可能的是,简单地使用CPU的'mod'操作将比任何你想出的骇客都快。 – 2012-03-16 15:02:50

回答

0

整除怎么样保持减去的数量由6至它达到零。 如果您得到零,则数字可以被整除6,否则不可以。 或 保持数字除以2(二进制移位操作),直到数字小于12. 然后从中减去6。如果小于零(不可除) 如果零可分。 如果不减去3 如果小于零(不可整除) 如果零可以整除。

0
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 
+0

现在解释一下,如何在不使用除法的情况下添加所有数字? – st0le 2012-03-16 04:33:50

+0

参考:http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_6 – Java42 2012-03-16 06:31:21

+0

老兄,你将如何总结所有数字而不使用mod或div或将其转换为字符串? – st0le 2012-03-16 07:46:43

0

您可以尝试使用可用的基本操作来实现除法算法。从四年级的基本长除法算法可能不够(只是做事情,而不是基地10基地2个,与bitshifting而不是乘)

7

1)简单(N & 1) == 0检查,如果数字是整除2

2)使用位黑客答案(由This线程。)由3

如果两个都为真检查整除,你的号码是6

+1

哼。打了一分钟,但我直接链接到[黑客](http://stackoverflow.com/a/3421654/487339)。 :^) – DSM 2012-03-16 04:38:22

+0

@DSM,我注意到了。 :d – st0le 2012-03-16 07:45:01

0

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

6的倍数是2和3的倍数,所以它应该同时满足2和3的可分性标准...所以......

  • 检查可分2

    1. 向右移位数
    2. 如果余数> 1,重复1次。
    3. 如果余数= 1,则返回FALSE,否则继续。

      检查由2整除,可明显通过(N & 1 == 0)也实现,如上所述。这只是简单地检查N为二进制表示的最后一位数字:如果它是1,N为奇数(因此由2 NOT整除),如果它是0,这是完全除尽...由3

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

如果我们扩展操作“位掩码”和“位移”的范围内,这很简单。

由于不少人已经说过,可除数为2等于(n & 1) == 0。 3的可分性在二进制中相对容易。初始化累加器a为0,然后重复a += (n & 3); n = (n >> 2);直到n为0如果(且仅当)一个是3是3