我正在尝试解决这个问题,我知道一种方法来解决它的数量为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等数字不起作用。所以我想知道哪种方法可以解决这个问题。
感谢。任何帮助表示赞赏
答案 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;
}
要了解这是否比数字解析方法更有效,您应该尝试对它们进行基准测试。