2012-03-16 600 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