编写一个取整数n的函数,并计算0到n之间有多少整数包含5

时间:2014-06-02 07:30:06

标签: javascript

我正在尝试解决这个问题,我知道一种方法来解决它的数量为0,但我无法解决它的5s数 我正在尝试像这样的东西

  function findFive(lastNumber){

        var count=1,k;
        if(lastNumber<5)
            return 0;
        else if(lastNumber===5)
            return 1;
        else{

            for(var i=6;i<=lastNumber;i++){
                k=i;
                while(k>0){

                    if(k%5==0 && k%10!==0)
                        count++;
                        k=k/5;
                }
            }
            return count;
        }
    }

但这对50,550,500等数字不起作用。所以我想知道哪种方法可以解决这个问题。

感谢。任何帮助表示赞赏

3 个答案:

答案 0 :(得分:1)

我们可以看到总数的模式,因为我们不断增加数字。

1    -- 0
5    -- 1
10   -- 0 * 9   + 10^0 = 1
59   -- 1 * 5   + 10^1    
60   -- 1 *(6-1)+ 10^1
100  -- 1 * 9   + 10^1 = 19
599  -- 19* 5   + 10^2
600  -- 1 *(6-1)+ 10^2
1000 -- 19* 9   + 10^2 = 271 

使用此模式,我们可以通过查看数字中的每个数字来获得结果 例如:

332    -- 3*19 + 3*1 + 2*0 
984    -- [(9-1)*19 + 100] + [(8-1)*1 + 10] + [4*0]
3943   -- 3*271 + ((8-1)*19 + 100) + 4*1 + 3*0
1543   -- 1*271 + (5*1 +44) 

然后我们可以编写一些代码。

function findFive(n){
    // we'll cast the value to a string, to be able to grab the Most Significant Digit easily
    return _findFive(String(n))["t"]    
}
// helper function. Returns the integer value of the number without 
// the first digit (eg. "3948" returns 948)
function remaining(n){                      
    return n.length > 1 ? parseInt(n.substr(1)) : 0;
}

// Recursive function. Returns the total number of 5s in the range 0 to n, and the multiplier for the next higher digit
function _findFive(n){
    if(n.length == 0) return {t:0,m:0};
    var result = _findFive(n.substr(1));    // get the total from the less significant digits. 
                                            // Also returns the multiplier for the MSD
    var msd = n[0];                         // Most significant digit
    if(msd < 5)         total = msd * result["m"] + result["t"];
    else if(msd == 5)   total = msd * result["m"] + remaining(n) + 1;
    else                total = (msd-1) * result["m"] + Math.pow(10,n.length-1) + result["t"];

    var multiplier = result["m"]* 9 + Math.pow(10,n.length-1);  // calculate multiplier for next higher digit
    return {t:total,m:multiplier}   
}

此代码将在log(n)时间内解决问题。没有必要处理范围(O(n)时间)内的每个数字来得到答案。

答案 1 :(得分:0)

要计算包含5的整数数,范围为0...lastNumber,请尝试以下操作:

function findFive(lastNumber){
    var count = 0,
        str = lastNumber + '';
    for(var i = 0; i <= lastNumber; i++){
        if((i+'').indexOf('5') !== -1){
            count++;
        }
    } 
    return count;
}

结果:

findFive(60)     // 15
findFive(550)    // 146
findFive(550746) // 255502

请记住,这个数字越大,计算结果所需的时间就越多。

答案 2 :(得分:0)

你可以把它变成一个字符串并搜索它。像,

function findFive(upperBound) {
  var count = 0;
  for (var i = 0; i < upperBound; ++i) {
    if (i.toString().match(/5/)) {
      ++count;
    }
  }
  return count;
}

要了解这是否比数字解析方法更有效,您应该尝试对它们进行基准测试。