范围内的数字计数
假设我们有一个介于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
以上是 范围内的数字计数 的全部内容, 来源链接: utcz.com/z/355639.html