蓝桥杯:算法提高 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);
    }
}

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