美文网首页
1-n中1的个数

1-n中1的个数

作者: EJ17zj | 来源:发表于2017-08-18 22:05 被阅读49次

题目描述:
求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1-13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

求解思路:

  • 给定一个数,判断这个数字中1的个数是容易的,而1-n共n个数字,如果每个数字都判断的话计算量是极大的;
  • 求出1(1),10(2),100(21),1000(301),10000(4001),100000(50001)……这些数之间有一定的规律但又没有规律,求数字之间的组合同样没有规律可言;
  • 给定一个数字,求其个位、十位、百位…为1时对应的数字有哪些,这是容易求的,而1-n这n个数字包含1的个数即为个位为1的数+十位为1的数+百位为1的数+……
    • n=12345时,百位为1的数字包含(0-12)1(0-99),即(12+1)*100;
    • n=12145时,百位为1的数字包含(0-11)1(0-99) + 121(0-45),即(11+1)100+(45+1) = 12100+(45+1);
    • n=12045时,百位为1的数字包含(0-11)1(0-99),即(11+1)100 = 12100;
    • 规律:百位为1的数字,求n中百位以上的数字(gao=12),百位以下的数字(di=45),当百位>1时,个数为(gao+1)100,当百位==1时,个数为gao100+(di+1),当百位==0时,个数为gao*100。

代码

//gao+8,当对应位==0时,不产生进位,当对应位>1时,会产生进位
int NumberOf1Between1AndN_Solution(int n)
{
    int count = 0;
    for (int wei = 1; wei <= n; wei *= 10) {
        int gao = n / wei;
        int di = n % wei;
        count += (gao + 8) / 10 * wei + (gao % 10 == 1)*(di + 1);
    }
    return count;
}

类似题目:页码统计

相关文章

  • 1-n中1的个数

    题目描述:求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1-13...

  • 位运算和数学

    pow(x,n) 二进制中1的个数 n = 5(0101)时,返回2,n = 15(1111)时,返回4 1-n中...

  • 2020-04-17阿里巴巴实习生笔试题

    2020.4.17 阿里巴巴实习生笔试题 1、输入一个数 n,要输出 n个数,这n个数是 1-n 的排列, 要求满...

  • Patching Array

    题目来源给一个数组array和一个数n,要求最多加入几个元素才能使得array中的子集元素和能够构成从1-n的数。...

  • Java计算1-n个数阶乘的和的代码

    如下的代码内容是关于Java计算1-n个数阶乘的和的代码。 import java.math.BigInteger...

  • Java日记2018-05-24---分割01

    3 数组中重复的数字 *首先看到有要求复杂度为 O(N) + O(1)首先要注意这个数组特殊,值都是1-n之间,然...

  • Find the Duplicate Number

    题目来源找一个数组中重复的数字,size=n+1,数字范围1-n,不能用额外空间,不能改变原数组,时间复杂度小于O...

  • 面试题2-不改变数组得到一个重复的数字

    题目要求 在一个长度为n+1的数组里所有的数字都在1-n的范围之中,所以数组中至少有一个数字是重复的。 请找出数组...

  • 算法 - 统计数字 - 易

    算法 - 统计数字 - 易 给定数字 n (1<= n <= 1e9) ,计算1-n的每个数字,分别使用了多少次0...

  • 381. 螺旋矩阵 II

    描述 给你一个数n生成一个包含1-n^2的螺旋形矩阵 样例 sn = 3矩阵为 代码

网友评论

      本文标题:1-n中1的个数

      本文链接:https://www.haomeiwen.com/subject/owkzrxtx.html