본문 바로가기
알고리즘/백준

10757번: 큰 수 A + B (C언어)

by Sondho 2021. 2. 3.


풀이

1. A와 B를 입력

 

2. A의 크기와 B의 크기를 받아온 뒤, 비교해서 큰 값까지 while(idx < max_idx)

(작은 값으로 돌리면 큰값을 전부 가져오지 못함.)

 

3. 아까 받아온 크기를 이용해서

A의 맨 마지막 인덱스( A[A_idx] ) + B의 맨 마지막 인덱스( B[B_idx] ) + 자리올림( regroup ) % 10을

sum의 0인덱스부터 순서대로 넣어준다.

 

4. A의 값 + B의 값 + 자리올림이 10이상이면 regroup = 1, 아니면 regroup = 0

 

5. sum의 뒤집어서 출력한다.


소스코드 - 재귀함수 사용

재귀함수 : https://dojang.io/mod/page/view.php?id=584

#include <stdio.h>	// printf, scanf
#include <string.h>	// strlen

void	print_reverse(char *s)
{
	if (!s)
    	return ;
	if (*(s + 1) != '\0')
		print_reverse(s + 1);
	printf("%c", *s);
}

void	get_sum(char *A, char *B, char *sum)
{
	int	A_idx, B_idx;
	int	idx, max_idx;
	int	a, b;
	int	n, regroup;

	A_idx = strlen(A) - 1;
	B_idx = strlen(B) - 1;
	max_idx = A_idx > B_idx ? A_idx : B_idx;
	idx = 0;
	regroup = 0;
	while (idx <= max_idx)
	{
		a = A[A_idx] - '0';
		b = B[B_idx] - '0';
		n = a + b + regroup;
		if (A_idx < 0)
			n = b + regroup;
		if (B_idx < 0)
			n = a + regroup;
		sum[idx++] = (n % 10) + '0';
		regroup = (n >= 10) ? 1 : 0;
		A_idx--;
		B_idx--;
	}
	if (regroup == 1)
		sum[idx++] = regroup + '0';
	sum[idx] = '\0';
	print_reverse(sum);
}

int	main(void)
{
	char	A[10001];
	char	B[10001];
	char	sum[10002];

	scanf("%s %s", A, B);
	get_sum(A, B, sum);
	return (0);
}

 

소스코드 - 배열 뒤집어서 출력

#include <stdio.h>	// printf, scanf
#include <string.h>	// strlen

char	*ft_reverse(char *s)
{
	int		s_len;
	int		idx;
	char	tmp;

	s_len = strlen(s);
	idx = 0;
	while (idx < s_len / 2)
	{
		tmp = s[idx];
		s[idx] = s[s_len - idx - 1];
		s[s_len - idx - 1] = tmp;
		idx++;
	}
	return (s);
}

void	get_sum(char *A, char *B, char *sum)
{
	int		A_idx, B_idx;
	int		idx, max_idx;
	int		a, b;
	int		n, regroup;

	A_idx = strlen(A) - 1;
	B_idx = strlen(B) - 1;
	max_idx = A_idx > B_idx ? A_idx : B_idx;
	idx = 0;
	regroup = 0;
	while (idx <= max_idx)
	{
		a = A[A_idx] - '0';
		b = B[B_idx] - '0';
		n = a + b + regroup;
		if (A_idx < 0)
			n = b + regroup;
		if (B_idx < 0)
			n = a + regroup;
		sum[idx++] = (n % 10) + '0';
		regroup = (n >= 10) ? 1 : 0;
		A_idx--;
		B_idx--;
	}
	if (regroup == 1)
		sum[idx++] = regroup + '0';
	sum[idx] = '\0';
	printf("%s\n", ft_reverse(sum));
}

int		main(void)
{
	char	A[10001];
	char	B[10001];
	char	sum[10002];

	scanf("%s %s", A, B);
	get_sum(A, B, sum);
	return (0);
}

회고

  • 몇 번의 시도 끝에 성공을 했다.
  • 구현 방법은 맞았지만 재귀함수로 출력하는 부분에서 실수를 했다.
  • 수정 전 코드로 실행하게 되면 *s == '\0'여부를 확인하고, printf에 '\0'값도 들어가버린다.
    12345\0를 출력하려고 할 경우, \054321로 널 문자가 맨 앞으로 위치하게 된다.
  • 출력상 겉보기에 정답하고 비슷하게 나와서 한참을 고생했다.
// 수정 전
void	print_reverse(char *s)
{
	if (*s != '\0')
		print_reverse(s + 1);
	printf("%c", *s);
}
// 수정 후
void	print_reverse(char *s)
{
	if (!s)
    	return ;
	if (*(s + 1) != '\0')
		print_reverse(s + 1);
	printf("%c", *s);
}

https://www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

'알고리즘 > 백준' 카테고리의 다른 글

3009번: 네 번째 점 (c언어)  (1) 2021.03.12
1929번: 소수 구하기 (c언어)  (0) 2021.02.15
1989번: 소수찾기  (0) 2021.02.14
1011번: Fly me to the Alpha Centauri (C언어)  (0) 2021.02.13
3190번: 뱀 (C언어)  (0) 2021.02.08

댓글