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