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。