题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
示例:
输入5 输出2
方法一:
此方法比较蠢比较暴力,是自己原生思想。只为了解题通过很多细都没有在意。思路是将十进制转化二进制中,统计数组中1的个数。
import java.util.Scanner;
public class Main{
public static void main(String[]args){
Scanner in = new Scanner(System.in);
int number = in.nextInt();
int[] a = new int[100];
int i=0;
int count=0;
while(number>=1) {
a[i++] = number%2;
//没有转成二进制数呢 数组还得逆序
number =number/2;
}
for(int j =0;j<a.length;j++) {
if(a[j] ==1) {
count++;
}
}
System.out.println(count);
}
}
方法二:
巧妙使用&操作符:
①只对正数而言:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int count = 0;
while(n>0){
if((n&1)>0){
count++;
}
n=n>>1;
}
System.out.println(count);
}
}
正负数均成立
public class Solution {
public int NumberOf1(int n) {
int count=0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
}
}
方法三:
方法三和方法一原理是一样的,只是对数的处理不同,方法三用了java里现成的方法操作的int 数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String s = Integer.toBinaryString(num);
num=0;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)=='1'){
num++;
}
}
System.out.println(num);
}
}
这里讲解一下Integer.toBinaryString方法。此方法将输入的数字转换成二进制数,但是转换输出的是String类型的字符串。
例如:String ss = Integer.toBinaryString(8);那么这里的ss就等于“1000”,注意它是一个字符串。
java中还有一个Integer.parseInt()方法。此方法将输入的数字字符组成的字符串转换成与其一致的数字。
例如: String s = “123456”;
int num = Integer.parseInt(s);
此处另外注意int 型数据在java中的大小范围就好。
总计:
很明显本题第二种方法更好一下。其他的在大数情况下容易出错。