public class n_1_300 { 

// 思路:分别计算“1”在每个位(个位,十位,百位……)上面出现的次数,叠加起来 

public static int countNum(int n) { 

if (n <= 0) { 

return 0; 

} 

int count = 0; 

int factor = 1; 

while (n / factor != 0) { 

int lowerNum = n - n / factor * factor; 

System.out.println("最低位是:" + lowerNum); 

int currentNum = (n / factor) % 10; 

System.out.println("当前位是:" + currentNum); 

int highNum = n / (factor * 10); 

System.out.println("最高位是:" + highNum); 

if (currentNum == 0) { 

// 如果为0,出现1的次数由高位决定 

count += highNum * factor; 

} else if (currentNum == 1) { 

// 如果为1,出现1的次数由高位和低位决定 

count += highNum * factor + lowerNum + 1; 

} else { 

// 如果大于1,出现1的次数由高位决定 

count += (highNum + 1) * factor; 

} 

factor *= 10; 

} 

return count; 

} 

public static void main(String[] args) { 

// TODO Auto-generated method stub 

System.out.println("含1个数为:" + countNum(25)); 

System.out.println(); 

System.out.println("含1个数为:" + countNum(125)); 

} 
}

以上代码为别处所转,以下纯为为个人理解,有误请指正,谢谢

计算25的全部步骤:

第一次循环,当factor=1时,while中的循环语句n / factor != 0,是为了求个位数带1的循环,如25取值25,继续,当执行了lowerNum = n - n / factor * factor时,最低位为0,当执行currentNum = (n / factor) % 10时,当前位为5,当执行highNum = n / (factor * 10)时,最高位为2。其实可以把“25”理解成“25.0”,低位,当前位,高位就是0,5,2,可以看出当前位就是指个位的5。

根据当前位计算个位数含“1”的个数,之所以用(highNum + 1) * factor表达式,是因为highnum代表高位的2,这里的2也可以理解成十以上的个位数含“1”的个数2个如:“11”个位数的“1”和“21”个位数的”1“。再加上“1”本身的1,所以个位含“1”共3个。

第二次循环,当factor=10时,while中的循环语句n / factor != 0,是为了求十位数带1的循环,此时,低位,当前位,高位分别为5,2,0,可以把“25”理解成“025”,即百位补了个0,可以看出当前位就是指十位的2,当前位大于1,用(highNum + 1) * factor表达式,表达式中的highnum为0,意思是百位为0,则有0个十位数为1的三位数,如果百位为1,则有1*10个十位数为“1”的三位数(如110,111,112,113……119共10个数),如果百位为2,则有2*10个十位数为1的三位数(如110,111,112,113……119,210,211,212,213……219共20个数)。表达式括号中的1指1*10个十位数为“1”的两位数(指10,11,12,13 ……19共10个数),所以结果是(0+1)*10=10,说明十位上含有10个含“1”的数。

第三次循环,停止,结果:个位数+十位数=3+10=13

计算100的全部步骤:

第一次循环,当factor=1时,125看成“125.0”,所以低位,当前位,高位就是0,5,12,计算表达式(highNum + 1) * factor,highNum =12代表了(11,21,31,41……121个位数的“1”共12个),再加上“1”本身的1,所以个位含“1”共13个。

第二次循环,当factor=10时,低位,当前位,高位就是5,2,1,计算表达式(highNum + 1) * factor,highNum =1,代表百位为1,则有1*10个十位数为1的三位数(如110,111,112,113……119共10个数),表达式括号中的1指1*10个十位数为“1”的两位数,(如10,11,12,13 ……19共10个数),(1+1)*10=20,十位数含“1”共20个。

第三次循环,当factor=100时,低位,当前位,高位就是25,1,0,计算表达式highNum * factor + lowerNum + 1,highNum =0,代表千位为0,则有0个百位数为“1”的四位数,lowerNum=1,代表十位为25,则有25个百位数为“1”的三位数(如:101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125),表达式中的1指1个百位数为“1”的三位数(如100),百位数含“1”共26个。

第四次循环,停止,结果:个位数+十位数+百位数=13+20+26=59