乙個非常有意思的問題:判斷乙個二進位制的數除以3的餘數。
思路:首先肯定會想到十進位制除3整除的規則: 每位數相加的和能被3整除。
但是按照這樣的思路去考慮二進位制的情況容易進入到死胡同裡。
考慮以下方法:
二進位制的數再加一位0就是原來的值*2,再加上一位1就是原來的值*2+1。
那麼考慮以下的狀態轉換:
(以下思路來自:
0@0 => 0 表示狀態0後面是0時,變成狀態0
0@1 => 0 表示狀態0後面是1時,變成狀態1
1@0 => 2 表示狀態1後面是0時,變成狀態2
1@1 => 0 表示狀態1後面是1時,變成狀態0
2@0 => 1 表示狀態2後面是0時,變成狀態1
2@1 => 2 表示狀態2後面是1時,變成狀態2
狀態0既是我們的初始狀態,也是我們的最終狀態。我們的自動機就做好了。現在,假如二進位制數10010走進來了。從狀態0出發,機器首先讀到乙個「1」,於是當前位置挪到狀態1,表明目前該數模3餘1;然後,系統讀了乙個「0」,我們緊跟著走到狀態2,表明二進位制數「10」被3除餘2;下一步,我們回到狀態1,表明「100」除以3餘1;再往後,我們得知「1001」能被3整除。最後呢,我們讀到乙個0,「1001」的兩倍當然還是能被3整除,我們依舊停留在原位。我們得到結論:二進位制數10010能被3整除。
實現**:
#include #include #include #include using namespace std;
int main(){
string s;
cin>>s;
int flag=0;
int i;
for(i=0;i
用正規表示式表示即為1((10*1)|(01*0))*10*
可用編譯原理的相關知識來推導。
判斷二進位製半整數(二進位制)
10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
二進位制數反轉
1 使用了歸併排序的思路 最快 但是時間複雜度比歸併排序要小,每行 都相當於完成了一次歸併 include unsigned revbit unsigned x void main 2 把乙個32位整數按位反轉,即第1位轉到第32位,第2位轉到第31位,依次下去。一牛人寫的演算法如下 unsigne...