java-----------华为机试----------求int型正整数在内存中存储时1的个数 (水题for java)
题目描述
输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
输入例子:
5
输出例子:
2
很简单啊,直接调用函数Interger.toBinaryString转为数字对应的二进制字符串;
解法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
String str = Integer.toBinaryString(num);
// 调用默认函数,讲十进制转二进制
int len = str.length();// 判断循环次数
int count = 0; // int 一个count作为计数器
for (int i = 0; i < len; i++) {
if (str.charAt(i) == '1') {
// 每遇到一个‘1’,计数器
count++;
}
}
System.out.println(count);
}
}
}
String str=Integer.toBinaryString(num);//10进制转2进制
Integer.toHexString(num);//10进制转16进制
Integer.toOctalString(num);//10进制转2进制;
当然这不算通解,通解在这:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
String s = Integer.toString(num, 2);
// Interger.toString(N,B),N为10进制数字,B为字符串内的进制
int len = s.length();// 判断循环次数
int count = 0; // int 一个count作为计数器
for (int i = 0; i < len; i++) {
if (s.charAt(i) == '1') { // 每遇到一个‘1’,计数器count+=1;
count++;
}
}
System.out.println(count);
}
}
}
顺带说下,任意进制转10进制,java也是有自带方法的。
int i = Integer.parseInt("32", N);
Integer i = Integer.valueOf("32", N);
这题,我参考了http://blog.csdn.net/lzuacm/article/details/52691106的思想后,他说n&(n-1)的次数就是1的个数;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
System.out.println(digitofNum(num));
}
}
public static int digitofNum(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
}
虽然我不明白原理,但是还是先记住吧!不过时间,空间和第一种一样,都比第二种通用的要少,不过也没少太多10个测试,就少2ms。