为了计算每个位w上出现多少个2,可以将数字分成三段,w位的值,高于w位的hig和低于w位的low。例如计算1231的十位上出现多少个2时,w十=3,hig=12,low=1。 为什么这样分呢,主要是因为每个位上出现2的次数不仅和当前位的数字有关,也和hig和low有关。理由如下: 仍然讨论十位上出现多少个2的情况, 如果w十<2,那么十位上出现2的次数为hig10。例如1211,十位上有2的数是20,21,22,23...29(十个),120,121,122...129(十个),220,221,222...229(十个)......1120,1121...1129(十个),所以十位上出现2的次数为hig10(注意这里是十位,其他位不考虑)。 如果w十=2,那么十位上出现2的次数为hig10+low+1。例如1221,这时除了小于2情况下的数,low=1,还会多出1220,1221,加一的原因是从0开始的。 如果w十>2, 这样就明显了,出现2的次数为(hig+1)10,可以自己推导下。 进而把这个规律推导到百位,w百 < 2, hig100;w百 = 2, hig100 + low+1;w百 > 2, (hig+1)*100。
import java.util.*;
import java.math.*;
public class Count2 {
public int countNumberOf2s(int n) {
int hig,cur,low;
int result =0;
for(int i=1;i<=n;i*=10){
hig = n / i;
cur = hig %10;
hig = hig / 10;
low = n % i;
if(cur<2){
result+=hig*i;
}
if(cur==2){
result+=hig*i+low+1;
}
if(cur>2){
result+=(hig+1)*i;
}
}
return result;
}
}