java计算1-n中1出现的次数

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值