記錄一個演算法題(java程式碼):統計正整數n的二進位制寫法中有多少個1
package ludims.main;
import java.util.Scanner;
public class myMain {
public static void main(String[] args) {
System.out.println("統計正整數n的二進位制寫法中有多少個1"); //題幹
Scanner in =new Scanner(System.in); //宣告一個Scanner物件,接收鍵盤輸入內容
System.out.println("請輸入一個整數:"); //提示輸入資料
while(in.hasNextLong()) {
long num = in.nextLong();
if(num >= 0) {
System.out.println(num + "二進位制寫法中有 " + count1num(num) + "個1"); //輸出計算結果
System.out.println("請再輸入一個整數:"); //提示輸入資料
}else {
System.out.println("輸入的不是正整數,請重新輸入正整數:"); //提示輸入了負數
}
}
in.close(); //關閉Scanner
System.out.println("輸入格式不對,程式結束!"); //程式結束提示
}
/**
* 統計正整數n的二進位制寫法中有多少個1
* @param n
* @return count
* 使用演算法:如n=9 (二進位制寫法1001) ,則n-1=8 (二進位制寫法1000),
* 1001 & 1000 後結果為1000,即去掉了最右端的1,
* 1000 再& 0111 結果為0000,如此統計迴圈的次數即可
*/
static int count1num( long n) {
int count;
for(count = 0 ; n > 0; ++count) { //每次將最後右端的1轉換成0,迴圈統計1的個數
n &= (n-1); //位運算
}
return count;
}
}