0과 9 사이의 정수 d가 있다고 가정하고 하한과 상한으로 각각 상한과 하한 두 개의 양의 정수가 있다고 가정합니다. 하한과 상한을 포함하여 하한과 상한 사이의 모든 정수에서 d가 숫자로 나타나는 횟수를 찾아야 합니다.
따라서 입력이 d =1, low =1, high =13과 같으면 숫자 d=1이 1,10,11,12,13과 같이 6번 발생하므로 출력은 6이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
함수 zero()를 정의하면 n이 필요합니다.
-
ret :=0, x :=0
-
n이 0과 같으면 -
-
1 반환
-
-
초기화 m :=1의 경우 m <=n일 때 m :=m * 10을 업데이트하고 -
를 수행합니다.-
a :=n / m
-
b :=n 모드 m
-
z :=모드 10
-
m의 자릿수가 n의 자릿수와 같으면 -
-
루프에서 나오세요
-
-
z> x이면 -
-
렛 :=렛 + ((a / 10) + 1)
-
-
그렇지 않으면 z가 x와 같을 때
-
렛 :=렛 + ((a / 10) * m + (b + 1))
-
-
그렇지 않으면
-
렛 :=렛 + (a / 10)
-
-
-
리턴 렛
-
함수 f()를 정의하면 x, n,
가 필요합니다. -
ret :=0
-
초기화 m :=1의 경우 m <=n일 때 m :=m * 10을 업데이트하고 -
를 수행합니다.-
a :=n / m
-
b :=n 모드 m
-
z :=모드 10
-
z> x이면
-
렛 :=렛 + ((a / 10) + 1)
-
-
그렇지 않으면 z가 x와 같을 때 -
-
렛 :=렛 + ((a / 10) * m + (b + 1))
-
-
그렇지 않으면
-
렛 :=렛 + (a / 10)
-
-
x가 0과 같으면 -
-
렛 :=렛 - m
-
-
-
리턴 렛
-
기본 방법에서 다음을 수행하십시오.
-
리턴 렛
-
반환 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