Posted by & filed under 每日一题.

【四脚猫】每日一题(2015年04月14日):编写一个方法,数出从0到n中数字2出现了几次?
例如:如果n为20,那么0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 中共2共出现了3次。

day提供的解法,经典的思路,这个也叫做蛮力法

1
2
3
4
5
6
7
8
function countTwo($start, $end){
$c = 0;
for($i=$start; $i<=$end; $i++){
$c += substr_count($i, '2');
}
return $c;
}
echo( countTwo(0, 20) );

青菜虫提供的解法,充分利用了字符串的相关函数,数字太大的时候要小心用这个哦

1
echo substr_count( implode('', range(0, $n)), '2' );

Beta给个非字符串解法(奥数题解法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function countNumber($n, $digit) {
$power = 1; //10为底的幂,代表当前计数的位
$count = 0;
while($power <= $n) {
$r = $n % (10 * $power); //$r 为 $n 不断十进制右移移除的数字组合的数值
$m = ($n-$r)/(10 * $power);//$m 为 $n 不断十进制右移后的值
$currentDigit = intval($r / $power);
if($currentDigit < $digit) {
$count += $m * $power;
} elseif($currentDigit > $digit) {
$count += ($m + 1) * $power;
} else {
$count += ($m + 1) * ($r % $power + 1);
}
$power *= 10;
}
return $count;
}

欢迎各位攻城狮,各位大牛给每日一题投稿,大家可以把自己碰到的有趣问题,工作中碰到的难题等…发送到 稿件邮箱:2313427189@qq.com