整数中1出现的次数(从1到n整数中1出现的次数)

整数中1出现的次数(从1到n整数中1出现的次数)

http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6

 public int NumberOf1Between1AndN_Solution(int n) {
        int cnt = 0;
        for (int m = 1; m <= n; m *= 10) {
            int a = n / m, b = n % m;
            cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
        }
        return cnt;
    }

设定1、10、100、1000…为中间点,分别考虑个位、十位、百位上…有多少个包含1的数进行分析。
根据设定的位置i(i=1、10、100…)对n进行分割,可以分为两部分,高位为a=n/i,低位为b=n%i。

当i=100时:

  • 若百位对应的数字大于等于2,设n=71343,那么a=713,b=43。此时百位为1的次数有a/10+1=72次。72次中每次都包含0到99这100个连续的数,那么百位为1的数一共有72×100=7200次。也即 (a/10+1)×100。
  • 若百位对应的数为1,设n=13198,那么a=131,b=98。此时百位对应的数就是1,需要分两部分考虑:
    (1)对于a/10=13次百位为1(0到12),每次都包含包含0到99个连续数,那么百位为1的数一共有13×100=1300次。也即a/10×100。
    (2)对于最高两位为13时,百位为1,此时百位为1所包含的数共有0到98个,即b+1个。
    综上,百位对应的数为1时,百位为1的数共有a/10×100+b+1个。
  • 若百位对应的数为0,设n=13066,那么a=130,b=66。那么百位为1的次数为0到12,13次,即a/10,每次均包含0到99个连续数,那么满足要求的数共有12×100=1200个。也即a/10×100。

综合以上情况:
当百位对应的数为0或者大于等于2时,有(a+8)/10次包含0到99个连续数。之所以补8,是因为当百位为0,则a/10==(a+8)/10,当百位>=2,补8会产生进位位,效果等同于(a/10+1)。
当百位对应的数是1时,需要增加未满100的数b+1个。

原文链接:https://blog.csdn.net/weixin_41025517/java/article/details/85177507

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务