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

C++에서 디지털 루트가 X인 N번째 양수 찾기

<시간/>

이 문제에서 두 개의 정수 값 N과 X가 주어집니다. 우리의 임무는 디지털 근이 X인 N번째 양수를 찾는 프로그램을 만드는 것입니다.

디지털 루트(X) N의 자릿수를 더하여 재귀적으로 자릿수를 더하여 합계가 한 자릿수가 될 때까지 찾은 한 자릿수 양수입니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

N = 5, X = 4

출력

40

솔루션 접근 방식

이 문제를 해결하는 간단한 방법은 숫자를 세는 것입니다. 디지털 루트는 X입니다. 이를 위해 1부터 시작하여 현재 숫자의 디지털 루트가 X와 같은지 확인하고 숫자를 세고 N번째 숫자를 반환합니다.

우리 솔루션의 작동을 설명하는 프로그램

예시

#include <iostream>
using namespace std;
int calcDigitalRoot(int num) {
   int digitSum = 1000, number = num;
   while (digitSum >= 10) {
      digitSum = 0;
      while (number > 0) {
         digitSum += number % 10;
         number /= 10;
      }
      number = digitSum;
   }
   return digitSum;
}
int calcNthDigitalRoot(int X, int N) {
   int countDigitalRootVals = 0;
   for (int i = 1; countDigitalRootVals < N; ++i) {
      int digitalRoot = calcDigitalRoot(i);
      if (digitalRoot == X) {
         ++countDigitalRootVals;
      }
      if (countDigitalRootVals == N)
         return i;
   }
   return -1;
}
int main(){
   int X = 4, N = 5;
   cout<<N<<"th positive number whose digital root is "<<X<<" is "<<calcNthDigitalRoot(X, N);
   return 0;
}

출력

5th positive number whose digital root is 4 is 40

효율적인 접근

문제를 해결하는 효율적인 접근 방식은 N 번째 다음과 같은 직접 공식을 사용하여 X와 동일한 디지털 루트를 갖는 숫자,

Nth number = (N + 1)*9 + X

우리 솔루션의 작동을 설명하는 프로그램

예시

#include <iostream>
using namespace std;
int calcNthDigitalRoot(int X, int N) {
   int nthNumber = (((N - 1) * 9) + X);
   return nthNumber;
}
int main() {
   int X = 4, N = 12;
   cout<<N<<"th positive number whose digital root is "<<X<<" is "<<calcNthDigitalRoot(X, N);
   return 0;
}

출력

12th positive number whose digital root is 4 is 103