Recursive Digit Sum - https://www.hackerrank.com/challenges/recursive-digit-sum/problem
파라미터로 전달받는 숫자를 각 자리마다 더해서 일의 자리가 될 때 return 하는 함수를 만들면 된다.
n=148, k=3일때를 예시로 들어보자.
n은 파라미터로 전달하는 숫자이고 이를 k번 곱하면 P가 된다.
즉, P는 148148148이 된다.
super_digit(P) = super_digit(148148148)
= super_digit(1+4+8+1+4+8+1+4+8)
= super_digit(39)
= super_digit(3+9)
= super_digit(12)
= super_digit(1+2)
= super_digit(3)
= 3.
위와 같이 프로그램이 작동하게 superDigit 함수를 만들면 된다.
<superDigit>
superDigit 함수의 파라미터는 char 포인터 변수 n, int형 변수 k이다. n에는 숫자를, k는 숫자를 반복할 횟수를 전달받는다.
sum은 long 타입으로 선언하는 데 그 이유는 int형으로 선언을 할 시 매우 큰 수가 들어왔을 때 int형 범위에 벗어나기 때문이다.
char 타입 포인터 변수 s를 선언해주고 동적 할당해준다.
*n이 '\0'이 될때 까지 n++해주고 sum에 *n-'0' 값을 계속 더해준다. -'0'을 해주는 이유는 *n 에 들어간 숫자는 숫자문자이기 때문에 정수형으로 만들기 위하여 -'0'을 해줘야 한다.
그리고 sum을 k번 곱한다. string을 k번 곱해도 결국에 한자리씩 더하는 것이기 때문에 sum을 k번 곱하는 것과 같은 결과를 도춣나다.
sum이 10이상이면, 즉 두자리 수이면 위 과정을 한번 더 해야한다. sum을 10으로 나눈 몫이 0이 되기 전까지 s++해주고 *s에는 sum을 10으로 나눈 나머지+'0' 넣어준다. +'0'을 하는 이유는 s는 char형이기 때문이다. 그리고 return superDigit(s,1)을 해준다. k 부분에 1을 넣어주는 이유는 k번 반복할 이유가 없기 때문에 그냥 1을 해주는 것이다.
sum이 10미만이면 그냥 sum을 리턴해주면 된다.