例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Sample Input
12
Sample Output
5
分析:直接去每个统计是不现实的,肯定会超,那么就需要分析出规律了,把问题拆分来看的话,我们只需统计个位,十位,百位。。。。,每个的数字,然后累加就可以了,每种数字统计的时候,和当前位的数值有关系。具体分析如下:
假设N,我们要计算百位上出现1的次数,将由三部分决定:百位上的数字,百位以上的数字,百位一下的数字。
如果百位上的数字为0,则百位上出现1的次数仅由更高位决定,
比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。
等于更高位数字乘以当前位数,即12 * 100。
如果百位上的数字大于1,则百位上出现1的次数仅由更高位决定,比如12213,
百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300个。
等于更高位数字加1乘以当前位数,即(12 + 1)*100。
如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,
受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,
出现1的情况是12100~12113,共114个,等于低位数字113+1。
那么代码就好写了:
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
int n = in.nextInt();
int t,tn;
long ans = 0;
tn = n;
int mul = 1;
while (tn != 0){
t = tn % 10;
if (t == 0)
ans += n / (mul * 10) * mul;//仅仅和高位有关
else if (t == 1){
ans += n / (mul * 10) * mul; //高位
ans += (n % mul) + 1; //低位
}else
ans += (n / (mul * 10) + 1) * mul; //高位
mul *= 10;
tn /= 10; //依次个位,十位,百位。。
}
System.out.println(ans);
}
}