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

C++에서 숫자가 0이 아닌 K보다 많은 숫자를 포함하지 않는 범위의 숫자 개수

<시간/>

변수에서 시작하여 변수 끝까지 정수 범위가 주어지고 변수 k가 주어지고 작업은 숫자가 0이 아닌 'k'보다 크지 않도록 범위의 숫자 개수를 계산하는 것입니다. 숫자.

입력 - int 시작 =50, 끝 =100 및 K =2;

출력 - 숫자에 0이 아닌 숫자가 포함되지 않는 범위의 숫자 개수는 다음과 같습니다. 50

설명 - 범위는 50에서 100까지이며 k는 2로 지정됩니다. 우리가 볼 수 있듯이 50과 100 사이의 모든 숫자는 2자리 숫자를 가지므로 100이라는 숫자를 제외하고는 2개 이상의 0자리를 포함할 수 없습니다. 3자리 숫자이지만 2개의 0도 그 이하이므로 개수는 50입니다.

입력 - int 시작 =50, 끝 =100 및 K =1;

출력 - 숫자가 0이 아닌 K보다 크지 않은 범위의 숫자 개수

숫자:5

설명 - 범위는 50에서 100까지이며 k는 1로 지정됩니다. 보시다시피 50에서 100 사이의 모든 숫자는 2자리 숫자이므로 1 이하 또는 k가 0이 아닌 숫자인 숫자는 50입니다. , 60, 70, 80, 90이므로 카운트는 5입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • 변수 시작부터 변수 끝까지 정수 범위를 만들고 k를 선언하고 값을 입력합니다. 추가 처리를 위해 데이터를 함수에 전달합니다.
  • vec라고 가정해 봅시다. 벡터 유형의 변수를 생성합니다.
  • 변수 start 내부의 값이 될 때까지 루프를 시작합니다. 이제 while 내부에서 값을 val % 10으로 벡터에 푸시하고 val을 val / 10으로 설정합니다.
  • vec.begin() 및 vec.end()를 인수로 전달하여 STL에서 역함수를 호출합니다.
  • memset을 사용하여 배열의 값을 -1로 설정합니다.
  • 숫자가 0이 아닌지 확인하는 함수인 check_val(0, 0, 0, vec)을 반환합니다.
  • check_val 함수 내부-:
    • IF place가 벡터의 크기와 같은지 확인한 다음 IF temp <=k를 확인한 다음 1을 반환하거나 0을 반환합니다.
    • IF Arr[place][temp][set_val]이 -1과 같지 않은지 확인한 다음 arr[place][temp][set_val]의 값을 반환합니다.
    • 결과를 저장할 변수를 선언하고 0으로 설정합니다.
    • 변수 val을 선언하고 9로 설정합니다. IF set_val이 1과 같으면 ELSE를 i++로 설정합니다.
    • 0에서 값 val까지 FOR 루프 시작
    • 루프 내부에서 temp_2를 temp로 설정하고 IF 1이 0과 같지 않은지 확인한 다음 temp_2의 값을 1씩 증가시키고 temp_3을 set_val로 설정하고 i가 vec[place]보다 작은지 확인한 다음 temp_3을 1로 설정합니다.
    • count 값을 check_val(place + 1, temp_2, temp_3, vec) 함수에 대한 재귀 호출로 설정
    • 반환 arr[place][temp][set_val]은 count와 같습니다.

예시

#include <bits/stdc++.h>
using namespace std;
int arr[20][20][2];
int K;
int check_val(int place, int temp, int set_val, vector < int > vec) {
   if (place == vec.size()) {
      if (temp <= K) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][set_val] != -1) {
      return arr[place][temp][set_val];
   }
   int count = 0;
   int val = (set_val ? 9 : vec[place]);
   for (int i = 0; i <= val; i++) {
      int temp_2 = temp;
      if (i != 0) {
         temp_2++;
      }
      int temp_3 = set_val;
      if (i < vec[place]) {
         temp_3 = 1;
      }
      count += check_val(place + 1, temp_2, temp_3, vec);
   }
   return arr[place][temp][set_val] = count;
}

int Not_more_k(int val) {
   vector < int > vec;
   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   return check_val(0, 0, 0, vec);
}
int main() {
   int start = 50, end = 100;
   K = 2;
   int count = Not_more_k(end) - Not_more_k(start);
   cout << "Count of Numbers in Range where the number does not contain more than K non zero digits are: " << count;
   return 0;
}

위의 코드를 실행하면 다음과 같은 출력이 생성됩니다 -

출력

Count of Numbers in Range where the number does not contain more than K non zero digits are: 50