Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

범위의 자릿수

<시간/>

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