package edu.cqu.algorithmTest;
import java.util.Scanner;
/*
* 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。
*
* 思路:https://blog.csdn.net/sjf0115/article/details/8600599
*
*
* */
public class Countnum {
public static void main(String[] args) {
// TODO Auto-generated method stub
try(Scanner in = new Scanner(System.in)){
System.out.println(Count(in.nextInt()));
}
}
public static int Count(int n) {
int count = 0; //统计1的个数
int Fac = 1; //数字位数变化的时候,权重的改变
int low = 0,cur = 0,high = 0; //低位数字,当前位数字和高位数字
if(n <= 0) return 0;
while(n / Fac != 0) {
//低位数字 例如数字 412: Fac = 10,表示当前在处理十位,低位412 - (412/10)*10 = 2
low = n - (n/Fac)*Fac;
//当前位
cur = (n/Fac) % 10;
//高位
high = (n / Fac) /10;
if(cur == 0) {
//如果为0,出现1的次数由高位决定
count += high * Fac;
}else if(cur == 1) { //如果为1,出现1的次数由高位和低位决定
count += high * Fac + 1;
}else { ////如果大于1,出现1的次数由高位决定
count += (high + 1) * Fac;
}
Fac *= 10; //位数提高
}
return count;
}
}