NYOJ100. 1的個數(位運算&位操作)
阿新 • • 發佈:2019-01-29
1的個數
時間限制:3000 ms | 記憶體限制:65535 KB 難度:1- 描述
- 小南剛學了二進位制,他想知道一個數的二進位制表示中有多少個1,你能幫他寫一個程式來完成這個任務嗎?
- 輸入
- 第一行輸入一個整數N,表示測試資料的組數(1<N<1000)
每組測試資料只有一行,是一個整數M(0=<M<=10000) - 輸出
- 每組測試輸出佔一行,輸出M的二進位制表示中1的個數
- 樣例輸入
-
3 4 6 7
- 樣例輸出
-
1 2 3
【分析】位運算&位操作
除去傳統方法(如:不斷除2取餘,統計餘數1的個數)外,這裡使用一種更優的方法——位運算&位操作中的小技巧:x & (x - 1)
x & (x - 1)用於消去x最後一位的1,因此不斷使用 x & (x - 1) 消去x的尾1,計算總共消去了多少次即可。
#include <stdio.h> #define maxm 10005 int n,m; int ans_1[maxm]; //ans_1[i]-i的二進位制表示中1的個數 //打表計算 void getAns1(int *a) { int i,temp; a[0]=0; for(i=1;i<maxm;i++) { temp=i; a[i]=0; //不斷使用 x&(x-1)消去x二進位制表示中末尾的1 //然後統計次數,即a[i] while(temp>0) { temp=(temp&(temp-1)); a[i]++; } } } int main() { getAns1(ans_1); scanf("%d",&n); while(n--) { scanf("%d",&m); printf("%d\n",ans_1[m]); } return 0; }