n < 10 이므로 INT_MAX > 123456789 (n=9일 때 마지막 조합)
int 범위 안에서 결과를 저장할 수 있음.
ft_print_combn
함수는 재귀함수 ft_combn
을 호출한다.
ft_combn
은 digits == depth
가 될 때까지 result
값을 재귀적으로 전달한다.
digits == depth
일 때, results 값을 ft_putnbr
을 통해서 출력한다.
(이 때 ft_putnbr
은 앞서 사용한 ft_putnbr
과 조금 다르다. digits
만큼의 길이로 출력)
‘, ‘ 처리를 위해서 해당 문자열을 출력할 때 마지막 조합인지 체크를 한다.
(10 - digits)
를 첫번째 숫자로 갖는다./* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_ft_print_combn.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: sungjpar <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/02/03 10:02:44 by sungjpar #+# #+# */
/* Updated: 2022/02/03 13:20:28 by sungjpar ### ########.fr */
/* */
/* ************************************************************************** */
#include <unistd.h>
void ft_print_combn(int n);
void ft_putnbr(int nb, int digits, int depth);
void ft_combn(const int digits, int depth, int cur_num, int result);
int ft_is_last(int n, int size);
void ft_print_combn(int n)
{
if (n < 1 || n > 9 )
return ;
ft_combn(n, 0, 0, 0);
}
void ft_combn(const int digits, int depth, int cur_num, int result)
{
int r;
if (digits == depth)
{
ft_putnbr(result, digits, 0);
if (!ft_is_last(result, digits))
write(1, ", ", 2);
return ;
}
while (cur_num <= (9 - digits + depth + 1))
{
r = result * 10 + cur_num;
ft_combn(digits, depth + 1, ++cur_num, r);
}
}
void ft_putnbr(int nb, int digits, int depth)
{
unsigned int n;
char c;
if (nb < 0)
{
n = -nb;
write(1, "-", 1);
}
else
n = nb;
c = n % 10 + '0';
n /= 10;
if (depth < digits - 1)
ft_putnbr(n, digits, ++depth);
write(1, &c, 1);
}
int ft_is_last(int n, int size)
{
int i;
i = 1;
while (n > 9)
{
n /= 10;
++i;
}
return (n == (10 - size) && i == size);
}