求數補碼中1的個數

2021-08-30 02:43:56 字數 748 閱讀 1983

有n個正整數的範圍內請你輸出這n個正整數的補碼中存在有多少個1?

時間限制: 2 sec  記憶體限制: 128 mb

每乙個輸入檔案只有一組測試資料

第一行為n,(1<=n<=2e6)

接下來有n個64位的正整數

保證測試檔案所有數補碼中1總數佔的比率在10%左右

輸出補碼中1的個數

378

2

5
如果直接暴力求解 每個數都一點一點的求 肯定會超時 這時候就要使用位操作中的與操作運算子&

&的作用是計算的時候按位計算,&兩邊運算元對應位上全為1時,結果的該位值為1。否則該位值為0

我們用&運算子來對n和n-1進行與操作 這將會把補碼中的乙個且只有乙個1轉換為0 下面用圖來解釋

可以看到 15補碼中1的個數有4個而我們對15進行操作4次後15變為0 也就是說我們每次進行操作都會把15補碼中的乙個1轉換為0 以此類推進行了多少次n&(n-1)並且把結果賦給n;操作 n的補碼就有多少個1 因此我們用這種方法就可以節省90%的時間 具體**如下

#includeusing namespace std;

int main(void)

}cout << ans << endl;

return 0;

}

第一次寫部落格 請多諒

求陣列中逆序的個數

考慮一下,逆序是說a i a j i乙個比較好的思路是利用分治的思想 先求前面一半陣列的逆序數,再求後面一半陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數 也就是逆序數 這三個過程加起來就是整體的逆序數目了。看這個描述,是不是有點像歸併排序呢?利用歸併排序的過程中,在每一次歸併兩個陣列...

求陣列中逆序的個數

考慮一下,逆序是說a i a j i乙個比較好的思路是利用分治的思想 先求前面一半陣列的逆序數,再求後面一半陣列的逆序數,然後求前面一半陣列比後面一半陣列中大的數的個數 也就是逆序數 這三個過程加起來就是整體的逆序數目了。看這個描述,是不是有點像歸併排序呢?利用歸併排序的過程中,在每一次歸併兩個陣列...

c語言 計算儲存中補碼1的個數詳解(演算法)

整形數字存放的方式都是以二進位制補碼儲存 列印的是原碼,轉換規則,原碼 取反 得反碼,反碼 1得補碼 當然正數的原反補相同 那麼如何計算乙個數的二進位制的補碼有幾個1呢 三,高階版 最優解 總結emmm什麼加剝落法。舉乙個例子123這個數字你要拿到分別拿到1,2,3怎麼辦 那就一層一層剝落下來 12...