資源限制
時間限制:1.0s 內存限制:256.0MB
輸入一個無符號整數x,輸出x的二進制表示中1的個數.
輸入:
76584
輸出:
7
首先在java中有幾個方法可以直接將一個整數轉換爲二進制數,分別爲Integer.toBinaryString();
Integer.toString(N,2): 用第二個參數指定的基數返回第一個參數的字符串表示形式
方法一:短除法
import java.util.Scanner;
public class ToBinary {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
String string="";
char des='1';
int sum=0;
while (n!=0){ //轉換爲二進制
string=n%2+string;
n=n/2;
}
for (int i = 0; i <string.length() ; i++) { //判斷'1'出現的次數
if(string.charAt(i) == des){
sum++;
}
}
System.out.println(sum);
}
}
方法二:位運算
import java.util.Scanner;
public class ToBinary {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int sum=0;
System.out.println(Integer.toString(N,2)); //顯示轉換後的二進制數
for (int i = 0; i <32 ; i++) { //因爲int型32位,故32次循環即可
if((N&(1<<i))==(1<<i)){ //用數字1不斷向左移位和原數字進行與運算
sum++;
}
}
System.out.println(sum);
}
}
方法三:同樣是位運算,但是更加巧妙
思考:例如整數12,二進制爲1100;
1100-1=1011,原數1100&1011=1000(即把低位第一個1後的數全清零)
1000-1=0111,上一步1000&0111=0則終止,減一操作執行2次,則原數有兩個1
結論:(原數-1)&原數,不斷循環,當結果爲0時結束,有多少次減一操作則有多少個1
import java.util.Scanner;
public class ToBinary {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int sum=0;
System.out.println(Integer.toString(N,2)); //顯示轉換後的二進制數
while (N!=0){
N=(N-1)&N;
sum++;
}
System.out.println(sum);
}
}