题目描述
给定一个整数m,求小于m的只带0,1的数字的个数(0除外)。例如:
输入:
30
输出:
3
因为小于30且只带0,1的数字有 1,10,11三个。
题目分析
只带0,1的数字可以看作一个二进制数字,可以找到小于m的最小的0,1数,这个数字我们可以当成一个二进制数字,这个二进制数字的值就是小于m的0,1数字的个数。
例如:
m 小于m的最大0,1数k 把k当成一个二进制数 k的值即个数
30 11(10进制) 11(二进制) 2e1 + 2e0 = 3
js代码
function test (m) {
//n是m的最高位-1
var n = Math.floor(Math.log10(m));
//sum存储最后的值
var sum = 0;
//从最高位开始遍历
for(var i = n; i >= 0; i--){
//temp存储每一位的值
var temp = parseInt(m/Math.pow(10,i));
//每遍历一次m的最高位会被去掉
m= m- temp * Math.pow(10,i);
if(temp != 0 && temp != 1){
//如果最高位不是0或1后面的位数全都赋值为1
for(var j = i ; j >= 0; j--){
sum = sum + Math.pow(2,j);
}
break;
}else{
if(temp == 1){
sum = sum + Math.pow(2,i);
}
if(temp == 0)
continue;
}
}
return sum;
}
另一种方法:
function test(num){
/*传入的参数是一个数字,把这个数字转换成字符串,再把字符串转换成数组,这样数字的位数就存储在了一个数组中。*/
var str = new String(num);
var arr0 = str.split("");
/*把数组倒过来,使数组下标对应数字的位数,例如12345,a[0]=5,表示最低位,a[4]=1,表示最高位。*/
var arr = arr0.reverse();
var sum = 0;
//从最高位开始遍历。
for(var i = arr.length-1;i >= 0;i--){
//如果最高位不是0或1,后面的位数全都赋值为1,并且结束循环。
if(arr[i] != 0 && arr[i]!= 1){
for(var j = i;j >= 0;j--){
//按照二进制进行加法。
sum = sum + Math.pow(2,j)
}
break;
}else if(arr[i] == 1){
sum = sum + Math.pow(2,i);
}else if(arr[i] == 0){
continue;
}
}
return sum;
}
console.log(test(100))