백준[C] : 큰수 A+B

지환·2022년 7월 2일
0

백준(C)

목록 보기
31/47
post-thumbnail

문제

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

입력

출력

첫째 줄에 A+B를 출력한다.

아이디어

출제의 의도
먼저, 큰수 A+B를 묻는 문제는 / 숫자 -> 문자 문자 -> 숫자 / 로 변환할 수 있냐를 물어보는 문제다.

[개념정리]
이것을 보고 어떤 개념이 있는지 파악해야한다.

  1. 10^1, 10^2, 10^3 가르키는 것을 알아야 한다. 10^1 = 2자리 표현 | 10^2 = 3자리 표현
    10^n => 10^n+1이 된다.

  2. Reverse함수를 사용한다. Reverse함수를 사용하는 이유는 세로 덧셈을 할 때는 일의 자리 숫자부터 받아올림을 하며 계산해나간다.

  3. reverse하면 그 다음은 어떻게 진행되는가? -> 자릿수에 대한 개념을 알아야된다. A+B를 했을 때, 어떤 것을 기준으로 더할 것인가? 답은 더 큰 것이 자릿수를 대표한다. (더 많은 인덱스 자리를 차지하고 있는 A 혹은 B

  4. 이제 숫자 -> 문자로 변경하는 아이디어를 알아야 된다. -> 이것은 A-‘0’ | B - ‘0’을 하면 된다. 0은 아스키코드 48을 의미하므로 0를 뺐을 때 변환된다. 왜냐하면 각 자리에는 0 ~ 9가 char로 저장되어 있다. 이 문자를 먼저 숫자로 변환해야 한다.

  5. 두 숫자의 덧셈이니 받아올림하는 수는 최대 1이다. 받아올림이 발생하면 carry는 1이고 아니면 carry는 0이다.

  6. 하지만 A와 B가 Null값일 경우 예외처리가 필요하다. Null 값일 경우 음수로 출력되기 때문이다.

  • reverse함수는 어떻게 구현하는가?
    가정) 10,20,key,30,50이 있다고 가정하자. 그렇게 되면 key값을 기준으로 양변을 change한다. 50, 30, key , 20, 10 => 이렇게 되면 A + B를 하게 됐을 때, 계산이 용이해진다.
    [reverse 구현]
  • 왼쪽, 오른쪽 변수가 있다고 가정하자. 그렇게 되면 그것을 기준으로 배열에 담아놨던 요소의 길이만큼[인덱스의 전체 길이] / 2 | for문 반복한다.
  • swap의 기본원리인 temp에 값을 담고 a = b | b = temp를 담는다. 반복적으로 실행하면 값을 reverse 된다.

코드

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void reverse(char arr[])
{
	int len = strlen(arr);
	for (int i = 0; i < len / 2; i++)
	{
		char temp = arr[i];
		arr[i] = arr[len - i - 1];
		arr[len - i - 1] = temp;
	}
}


int main()
{
	char A[10002] = { 0 }, B[10002] = { 0 }, res[10003] = { 0 };
	int carry = 0 , i;

	scanf_s("%s %s", A, B);
	reverse(A);
	reverse(B);
	int len = strlen(A) > strlen(B) ? strlen(A) : strlen(B);

	for (i = 0; i < len; i++)
	{
		int sum = A[i] - '0' + B[i] - '0' + carry;
		while (sum < 0) sum += '0';
		if (sum > 0) carry = 1;
		else carry = 0;
		res[i] = sum % 10 + '0';
	}
	if (carry == 1) res[len] = '1';
	reverse(res);
	printf("%s", res);
	return 0;
}

profile
아는만큼보인다.

0개의 댓글