小技巧,計算乙個十進位制整數在二進位制下「1」的個數

2021-08-14 04:39:09 字數 777 閱讀 8093

所以我寫了乙個預處理,處理出資料範圍內所有數在二進位制下有幾個1,並存進陣列裡。

想法ans->0

對每個數都mod 2,如果為1,則ans++;//即檢視每位上是否為2

最後ans->0 

迴圈以上步驟計算出所有數

有n個數

每個數i計算logi次

n∑logi

i=1複雜度:o(nlogn)

後來在大佬的指點下,發現了可以用遞推

計算count[a]的時候只要count[a>>1]計算出來了,那麼如果a二進位制下的末位為1,結果加1,否則不變

a>>1是位運算,就是把a在二進位制下直接向右移,那麼它的最後一位就沒了。

example

101001111我們要計算它的1的個數,只要把10100111的1的個數加一就好了

101001110我們要計算它的1的個數,它是等於10100111的

那麼我們的程式就出來了

#include#includeusing namespace std;

int main()

{ int count[1<<16];

for(int i=1;i<=(1<<16);i++)

{if((i&1)==0)

count[i]=count[i>>1];

else

count[i]=count[(i>>1)]+1;

//cout<

這裡有乙個&運算,可能有人不懂

&就是把兩個數在二進位制下,每一位進行與運算,a&1就可以知道a的最後一位是什麼

寫乙個二進位制數轉十進位制數的小程式

本來想用浮點數作為引數的,但是浮點數精度丟失造成的誤差使得程式不能正常執行 比如輸入引數值為1010.111時,對此值取整再用原值減整數值,1010.111 1010得到的小數部分結果賦給double型變數,變數的值變為0.1109999 所以改用字串作為引數。由於輸出結果仍為浮點數,當轉換結果的小...

乙個十進位制整數轉換成二進位制含多少個1

1。最簡單的方法 使用bitset cpp view plain copy unsigned count unsigned u 2。使用移位迴圈測試 cpp view plain copy unsigned count unsigned u return ret 3。使用分治法 若f n b n 表...

寫乙個C 程式,二進位制十進位制互換

現在提供乙個c語言程式給你,可以實現任何進製 1 16 到任何進製的轉換的呢?但是是c語言程式的,可以在vc 6.0sp6上除錯通過的,源程式如下 include include include include void main if a k 如果其中再次遇到 證明輸入有誤,終止程式 注意 前面兩...