javascript 编程(1)【小于整数m的带0,1的数字个数】

题目描述

给定一个整数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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值