n以内的1的个数

import java.util.Scanner;


public class main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int num;
		Scanner in = new Scanner(System.in);
		num=in.nextInt();
		int x=0,y=1;
		int a,b,c;
		while(num>=y)
		{
			a=num/(10*y);
			c=(num/y)%10;
			if(y==1)
				b=0;
			else
				b=num%y;

			if(c==0)
				x+=a*y;
			else if(c==1)
				x+=a*y+1+b;
			else
				x+=(a+1)*y;
			System.out.println(+a+"  "+c+"  "+b+"  "+x);
			y=y*10;
		}

	}

}

结果截图解释:每行依次向下分别为将个位,十位,百位,千位......分离出来得到的结果,每一行的四个数分别代表当前位数前面的数,当前位上的数,当前位上后面的数,加到当前位时一共加到的1的和,由于个位没有后面的数,最高位上没有前面的数,所以都赋值为0。

思路:将一个数以内的1的个数写成各位上1的个数相加的形式,就可以得到规律:所有的1的个数即为每位上出现的1的个数的和,而每位上1的个数为:当当前位上的数等于0时,1的个数是前面的数乘以当前位10,100,或1000;当当前位上的数等于1时,1的个数为数乘以当前位10,100,或1000再加上后面面的数再加1;当当前位上的数大于1时,1的个数为前面的数加1再乘以当前位!

如:1234的十位

将是位上的数分离出来后得到的前位数前面的数,当前位上的数,当前位上后面的数分别为:12   3    4

由于3>1,十位上的1的个数为:(12+1)*10=130;

若是1214的十位

将是位上的数分离出来后得到的前位数前面的数,当前位上的数,当前位上后面的数分别为:12   1    4

由于3==1,十位上的1的个数为:12*10+4+1=125;

若是1204的十位

将是位上的数分离出来后得到的前位数前面的数,当前位上的数,当前位上后面的数分别为:12   0    4

由于3==0,十位上的1的个数为:12*10=120。

原文地址:https://www.cnblogs.com/xiangwo/p/4553392.html