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

来源:互联网 发布:自我评价设计专业知乎 编辑:程序博客网 时间:2024/04/29 23:46

题目描述

给定一个整数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))
0 0
原创粉丝点击