藍橋杯:算法提高 P0401(三種方法計算二進制中1的個數)

資源限制
時間限制: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);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章