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

C++에서 주어진 자릿수 합으로 숫자(N보다 작거나 같음)를 셉니다.

<시간/>

입력으로 숫자와 합계를 포함하는 문자열 str이 제공됩니다. 목표는 합계와 동일한 자릿수를 갖는 str까지의 숫자를 찾는 것입니다.

예를 들어 이해합시다.

예를 들어

입력 - N="110" 합계=5

출력 - 주어진 자릿수 합이 있는 N보다 작거나 같은 숫자의 개수는 다음과 같습니다. 7

설명 - 자릿수의 합이 5인 최대 110개의 숫자는 다음과 같습니다.-

5, 14, 23, 32, 41, 50 및 104.

입력 - N="1000" 합계=3

출력 - 주어진 자릿수 합이 있는 N보다 작거나 같은 숫자의 개수는 다음과 같습니다. 10

설명 - 자릿수의 합이 3인 최대 1000개의 숫자는 다음과 같습니다. -

3, 12, 21, 30, 102, 111, 120, 201, 210 및 300.

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

이 접근 방식에서 우리는 배열 arr[18][2][162]에 숫자와 숫자의 합을 저장하기 위해 동적 프로그래밍을 사용할 것입니다. 여기서 18은 최대 18자리 숫자이고, 2는 값 0과 1입니다. 그리고 162는 18자리가 모두 9( 18*9=162 )인 경우 가능한 최대 합입니다.

요소 arr[i][j][k]의 값은 첫 번째 i자리가 고려되고 j가 0 또는 1인 숫자의 개수를 나타냅니다. N. (N이 123이고 i가 2이면 2자리 숫자가 12보다 크거나 같은지 확인합니다. 12와 같으면 j는 1이 되고 그렇지 않으면 j는 arr[i][j][k에서 0이 됩니다. ] ). 인덱스 k는 arr[i][j][k]에 있는 i자리의 합입니다.

i=N의 숫자이고 k=입력 합계인 경우 결과는 1이고 그렇지 않으면 0입니다.

다음 숫자( i+1th )를 채우기 위해 j를 확인합니다. j가 1이면 i-1 자리는 N의 i-1 자리와 같으므로 다음 자리는 N의 0에서 i+1번째 자리 사이의 값만 가질 수 있으므로 <=N이 됩니다.

j가 0이면 i-1 자리 숫자는 N의 i-1 자리 숫자보다 작습니다. 따라서 다음 숫자(i+1 번째) 위치에 대해 0에서 9 사이의 값을 배치할 수 있으며 여전히 다음보다 작습니다. 아니오.

마지막에 결과를 최종 카운트로 반환합니다.

  • 숫자 N과 합계를 숫자의 합으로 나타내는 문자열 str을 사용합니다.
  • 배열 arr[18][2][162]를 가져와 memset을 사용하여 -1로 초기화합니다.
  • 함수 count_digits(int i, bool check, int temp, int total, string str, int size)는 arr[][][]를 재귀적으로 채우고 끝에 N보다 작거나 같은 숫자의 개수를 주어진 값으로 반환합니다. 숫자 합계.
  • 현재 자릿수 i가 N의 자릿수와 같고 현재 합계 온도가 입력 합계와 같으면 1을 반환하고 그렇지 않으면 0을 반환합니다.
  • 계산 =arr[i][check][temp]. -1이 아니면 count를 결과로 반환합니다.
  • 임시 변수 check_2( bool ) 및 temp_2를 사용합니다. (int).
  • for 루프를 사용하여 숫자 0에서 9까지 탐색하고 검사가 1인지 0인지 비교합니다. 1이면 현재 숫자 ch를 str[i]와 비교합니다. 더 크면 루프를 끊습니다(아무것도 하지 않음).
  • check_2 설정 =확인 || 채널
  • temp_2 =temp + (ch - '0')을 현재 합계로 설정합니다.
  • 재귀적으로 자릿수 합계를 계산하기 위해 count_digits(i + 1, check_2, temp_2, total, str, size)를 추가합니다.
  • 끝에 결과로 계산됩니다.

예시

#include <bits/stdc++.h>
using namespace std;
int arr[18][2][162];
int count_digits(int i, bool check, int temp, int total, ing str, int size) {
   if (i == size) {
      if (temp == total) {
         return 1;
      } else {
         return 0;
      }
   }
   int count = arr[i][check][temp];
   if (count != -1) {
      return count;
   }
   count = 0;
   bool check_2;
   int temp_2;
   for (char ch = '0'; ch <= '9'; ch++) {
      if (!check) {
         if (ch > str[i]) {
            break;
         }
      }
      check_2 = check || ch < str[i];
      temp_2 = temp + (ch - '0');
      count += count_digits(i + 1, check_2, temp_2, total, str, size);
   }
   return count;
}
int main() {
   string str = "1101";
   int size = str.size();
   int total = 5;
   memset(arr, -1, sizeof(arr));
   cout << "Count of numbers smaller than or equal to N with given digit sum are: " << count_digits(0, 0, 0, total, str, size);
   return 0;
}

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

출력

Count of numbers smaller than or equal to N with given digit sum are: 26