范围内的数字计数

假设我们有一个介于0和9之间的整数d,我们还有两个正整数,分别作为上下限。我们必须找到d在低和高之间的所有整数(包括低和高边界)中以数字形式出现d的次数。

因此,如果输入像d = 1,低= 1,高= 13,那么输出将是6,因为数字d = 1出现了6次,如1,10,11,12,13。

为了解决这个问题,我们将遵循以下步骤-

定义一个函数zero(),将花费n,

  • ret:= 0,x:= 0

  • 如果n等于0,则-

    • 返回1

  • 对于初始化m:= 1,当m <= n时,更新m:= m * 10,做-

    • ret:= ret +(a / 10)

    • ret:= ret +(((a / 10)* m +(b +1)))

    • ret:= ret +(((a / 10)+1)

    • 从循环中出来

    • a:= n / m

    • b:= n mod m

    • z:= mod 10

    • 如果m中的位数与n中的位数相同,则-

    • 如果z> x,则-

    • 否则,当z与x相同时,则

    • 除此以外

    • 返回ret

    • 定义一个函数f(),它将取x,n,

    • ret:= 0

    • 对于初始化m:= 1,当m <= n时,更新m:= m * 10,做-

      • ret:= ret-m

      • ret:= ret +(a / 10)

      • ret:= ret +(((a / 10)* m +(b +1)))

      • ret:= ret +(((a / 10)+1)

      • a:= n / m

      • b:= n mod m

      • z:= mod 10

      • 如果z> x,则

      • 否则,当z与x相同时,则-

      • 除此以外

      • 如果x等于0,则-

      • 返回ret

      • 从主要方法执行以下操作

      • 返回ret

      • 返回f(d,高-f(d,低-1))

      让我们看下面的实现以更好地理解-

      示例

      #include <bits/stdc++.h>
      using namespace std;
      class Solution {
         public:
         int digitCount(int x){
            int ret = 0;
            while (x) {
               ret++;
               x /= 10;
            }
            return ret;
         }
         int zero(int n){
            int ret = 0;
            int x = 0;
            if (n == 0)
            return 1;
            for (int m = 1; m <= n; m *= 10) {
               int a = n / m;
               int b = n % m;
               int z = a % 10;
               if (digitCount(m) == digitCount(n))
               break;
               if (z > x) {
                  ret += ((a / 10) + 1) * m;
               } 
               else if (z == x) {
                  ret += (a / 10) * m + (b + 1);
               } else {
                  ret += (a / 10) * m;
               }
               cout << ret << endl;
            }
            return ret;
         }
         int f(int x, int n){
            int ret = 0;
            for (int m = 1; m <= n; m *= 10) {
               int a = n / m;
               int b = n % m;
               int z = a % 10;
               if (z > x) {
                  ret += ((a / 10) + 1) * m;
               }
               else if (z == x) {
                  ret += (a / 10) * m + (b + 1);
               } else {
                  ret += (a / 10) * m;
               }
               if (x == 0) {
                  ret -= m;
               }
            }
            return ret;
         }
         int digitsCount(int d, int low, int high){
            return f(d, high) - f(d, low - 1);
         }
      };
      main(){
         Solution ob;
         cout << (ob.digitsCount(1,1,13));
      }

      输入值

      1,1,13

      输出结果

      6