我想要一個算法,只使用移位,加或減操作來查找一個數是否是6的倍數。所以,基本上只是二元運算。如何檢查數字是否是6的倍數?
到目前爲止,我認爲我應該邏輯右移數字兩次除以4,然後從中減去6。但我知道我的方法有問題,不知道是什麼。
我想要一個算法,只使用移位,加或減操作來查找一個數是否是6的倍數。所以,基本上只是二元運算。如何檢查數字是否是6的倍數?
到目前爲止,我認爲我應該邏輯右移數字兩次除以4,然後從中減去6。但我知道我的方法有問題,不知道是什麼。
整除怎麼樣保持減去的數量由6至它達到零。 如果您得到零,則數字可以被整除6,否則不可以。 或 保持數字除以2(二進制移位操作),直到數字小於12. 然後從中減去6。如果小於零(不可除) 如果零可分。 如果不減去3 如果小於零(不可整除) 如果零可以整除。
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
您可以嘗試使用可用的基本操作來實現除法算法。從四年級的基本長除法算法可能不夠(只是做事情,而不是基地10基地2個,與bitshifting而不是乘)
好的。這是我將如何去做的(只是第一個想法):
6的倍數是2和3的倍數,所以它應該同時滿足2和3的可分性標準...所以......
檢查可分2:
如果餘數= 1,則返回FALSE,否則繼續。
檢查由2整除,可明顯通過(N & 1 == 0)也實現,如上所述。這只是簡單地檢查N爲二進制表示的最後一位數字:如果它是1,N爲奇數(因此由2 NOT整除),如果它是0,這是完全除盡...由3
如果我們擴展操作「位掩碼」和「位移」的範圍內,這很簡單。
由於不少人已經說過,可除數爲2等於(n & 1) == 0
。 3的可分性在二進制中相對容易。初始化累加器a
爲0,然後重複a += (n & 3); n = (n >> 2);
直到n爲0如果(且僅當)一個是3是3
ň整除你可以保持從數減去6,看到它得到爲零。如果結果小於零,那麼它不能被6 – 2012-03-16 04:31:34
整除效率不高,但可以僅使用減法實現模函數。 – st0le 2012-03-16 04:31:40
如果這是在真正的程序中使用:不要這樣做。只需使用'num%6',讓編譯器找出最快的方法。更有可能的是,簡單地使用CPU的'mod'操作將比任何你想出的駭客都快。 – 2012-03-16 15:02:50