不許用 和 來實現求任意數除以3的餘數

2021-07-05 10:35:49 字數 1039 閱讀 6616

前幾天參加乙個程式設計競賽,涉及到部分位運算的知識,準備不足掛了。事後在網上搜了一下位運算的介紹看到《位運算之美》這篇部落格,其中提到了乙個題目「不許用%和/來實現求任意數除以3的餘數」感覺挺有意思,可惜博文中沒有介紹方法,沒辦法只能自己解決了,解決方法如下:

第一種方法:迴圈減法

如果不用位運算,我們可以用一種最笨拙的方法,每次減3,直到小於3為止,剩多少自然是餘數了(-_-)。

第二種方法:位運算遞迴求解

這種方法我們首先要分析一下,在什麼情況下數字才能被3整除?整數表示時,我們都知道數字相加為3的倍數時可以被3整除,那麼二進位制表示時呢?

這裡需要用到二項式定理中的一些知識了,我們知道

其中前m-1項都是可以被3整除的,餘數項既是(-1)^m項,所以我們可以用乙個餘數項r來記錄餘數項的值,所以對於給定的整數a,我們只需要統計a二進位制表示中1的位置即可,當1位於偶數字時那麼餘項為r-1(注意二進位制表示從2^0開始),1在奇數字的時候餘數項r+1,然後判定r的絕對值是否在3的範圍內,如果還是大於3則迭代呼叫該過程,具體演算法如下:

(1)判定整數a的符號,若a為負,則將a轉化為正處理,並記錄a的正負號;

(2)每次將a向右移動一位,判斷a&1的值是否為1,並判定該位置的奇偶性(r&1),若為奇數則r+1,否則r-1;

(3)根據a的正負號做調整,若a為負值,則r = -r,判定|r|<3,若滿足,當r>=0時返回r,若r<0時,返回r+3;

(4)若r>3,則重複1-3步,直到程式結束。

程式**如下:

int divisorbythree(int a)

do else

}else

a >>=1;

} while (a);

if (mark)

if (abs(remainder)<3)//剩餘值小於3,說明有可能被整除,或者剩餘1或2

else

}參考:

用動態申請虛擬記憶體求任意數階乘的C 實現

計算較小數的階乘程式很容易編寫,對於較大數的階乘的計算一般做法是使用陣列,但是陣列的長度有限,本程式採用動態申請虛擬記憶體空間的方法,優點是使用的不是物理記憶體,而是虛擬記憶體,申請的範圍更大。具體程式如下 include include using namespace std int lfac i...

用jQuery來繫結事件的3種方法和區別

1 doctype html 2 html lang en 3 head 4 meta charset utf 8 5 title title title 6head 7 body 8 ul 9 li 111 li 10 li 222 li 11 li 333 li 12 li 444 li 13 ...

用C語言實現 求兩數的最大公約數。

求兩數最大公約數的方法有很多,這裡重點介紹這兩種演算法 輾轉相除法 和 更相減損法。1 輾轉相除法。在兩個數中,找出大數,用大數除以小數,得到整數商和餘數,然後再不斷地用除數 原來的小數 除以餘數,直到沒有餘數為止。那麼除數即為最大公約數。所以我們可以用乙個迴圈來進行被除數 除數和餘數之間的位置互換...