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。

浙公网安备 33010602011771号