范围内的数字计数
假设我们有一个介于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:=nmodm
z:=mod10
如果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:=nmodm
z:=mod10
如果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