欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-19 15:06:40
...

题目:求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

思路:设定计数单位对应的位置(个十百千...),分别求n的个十百千等一直到最高位中1出现的次数,累加。

设i为位置点(i分别对应n的个位,十位,百位...):

当i对应的位置的数字等于0,那么这个数位上1出现的次数为(n/(10*i))*i;

当i对应的位置的数字等于1,那么这个数位上1出现的次数为(n/(10*i))*i + (n%i + 1);

当i对应的位置的数字大于等于2,那么这个数位上1出现的次数为(n/(10*i) + 1)*i;

举个例子,n = 105, i = 10, 十位对应的数字等于0,十位上1出现的次数为(105/(10*10))*10 = 1 * 10次;

n = 115, i = 10, 十位对应的数字等于1,十位上1出现的次数为(115/(10*10))*10 + (115%10 + 1) = 16次;

n = 125, i = 10, 十位对应的数字大于等于2,十位上1出现的次数为(125/(10*10) + 1)*10 = 20次;

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

其他数位类似来计算。

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        int count = 0;
        for(int i = 1; i <= n; i *= 10)
        {
            if((n/i)%10 == 0)
                count = count + (n/(10 * i))*i;
            else if((n/i)%10 == 1)
                count = count + (n/(10 * i))*i + (n%i + 1);
            else
                count = count + (n/(10 * i) + 1)*i;
        }
        return count;
    }
};

 

 

 

相关标签: 牛客网