思想:按照位数分别进行统计,设数字为num,位数为counter
个位:counter = num/10+n(个位为0,n=0;个位为1,n=1;个位>1,n=1)
十位:counter = num/100*10+n(十位为0,n=0;十位为1,n=低1位+1;十位>1,n=10)
百位:counter = num/1000*100+n(百位为0,n=0;百位为1,n=低2位+1;百位>1,n=100)
。。。。。。
算法描述:
a.求出num的位数figure
b.counter += num/10^i*10^(i-1),1<=i<=figure
c.余数remainder = num/10^(i-1)%10,如果remainder
= 1,counter+= num%10^(i-1)+1;如果remainder > 1,counter += 10^(i-1);remainder
= 0不做处理,1<=i<=figure。
/** * @author PLA * 统计从1到n整数中1出现的次数 */ public static void main(String[] args) { int num = 125; count(num); } public static void count(int num){ int figure = 0; int temp = num; int counter = 0;//计数器 int remainder = 0;//余数 while(temp!=0){//统计数字位数 temp = temp/10; figure++; } for(int i=1;i<=figure;i++){//从个位数开始统计 counter+=num/amount(i)*amount(i-1); remainder = num/amount(i-1)%10; if(remainder == 1){ counter+=num%amount(i-1)+1; } if(remainder > 1){ counter+=amount(i-1); } } System.out.println(num+"含1的个数为:"+counter+"个"); } private static int amount(int i) { // TODO Auto-generated method stub int n = 1; if(i==0) return 1; for(int j=0;j<i;j++){ n*=10; } return n; }