package experiment1;
import java.util.Arrays;
import java.util.Scanner;
public class Page {
public static int [] count= new int[10];
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入要计算和的页数:");
int n = input.nextInt();
solve(n);
int len = (int)(Math.log10(n))+1;//也可以通过循环来计算
for (int i = 0; i < len; i++) {//处理多计算的0,即减掉,
count[0] -= (int)(Math.pow(10, i));
}
for (int i = 0; i < 10; i++) {
System.out.println(count[i] + " ");
}
}
public static void solve(int n){
//Arrays.fill(count,0);
//计算位数
int len = (int)(Math.log10(n))+1;//也可以通过循环来计算
//System.out.println(len);
//最高位的值,同时也是划分区间的个数
int value_hight = n/(int)(Math.pow(10, len-1));
//System.out.println(value_hight);
/*
* 这个循环计算划分的单个区间的0-9的个数再乘上区间数
*/
for (int i = 0; i < 10; i++) {
//原公式为n*10^n-1,n是位数,因为是先把最高位去掉了所有是n=len-1
count[i] += value_hight*(len-1)*(int)(Math.pow(10, len-2));
//System.out.println(count[i] + " ");
}
/*
* 这个循环计算最高位出现的次数
*/
for (int i = 0; i < value_hight; i++) {
count[i] += (int)(Math.pow(10, len-1)) ;//最高位数字*相应的位置倍数
//System.out.println(count[i] + " ");
}
int low = (int)(Math.pow(10, len-1));//除去最高位的10的倍数
low = n%low; // 取余,把最高位去掉,比如567%100(上面算的low)=67
if(low == 0){ //如果low为0
count[value_hight]++; //说明是600%100=0这种情况,直接最高位加1就好了
count[0]+=len-1;//0的个数加上除去最高位的位数个数len-1 -> 如600,3-1=2;
return;
}else{
int lenT = (int)(Math.log10(low))+1;//计算除去高位后低位的位数,如67的位数
if(lenT != len-1){//就是1001中间有零的这种情况,中间的零也要算上
count[0] += (len-lenT-1)*(low+1);//总位数-去算得的位数-1是高位就得中间零的个数,在乘上算得的低位
count[value_hight] +=1+low; //高位刚刚算了几个区间的还有本身的比如567的5出现的次数还要加上67+1=68
solve(low);//继续递归
}else{//中间没0的情况
count[value_hight] +=1+low; //高位刚刚算了几个区间的还有本身的比如567的5出现的次数还要加上67+1=68
solve(low);//继续递归
}
}
}
}