첫째 줄에 A+B를 출력한다.
출제의 의도
먼저, 큰수 A+B를 묻는 문제는 / 숫자 -> 문자 문자 -> 숫자 / 로 변환할 수 있냐를 물어보는 문제다.
[개념정리]
이것을 보고 어떤 개념이 있는지 파악해야한다.
10^1, 10^2, 10^3 가르키는 것을 알아야 한다. 10^1 = 2자리 표현 | 10^2 = 3자리 표현
10^n => 10^n+1이 된다.
Reverse함수를 사용한다. Reverse함수를 사용하는 이유는 세로 덧셈을 할 때는 일의 자리 숫자부터 받아올림을 하며 계산해나간다.
reverse하면 그 다음은 어떻게 진행되는가? -> 자릿수에 대한 개념을 알아야된다. A+B를 했을 때, 어떤 것을 기준으로 더할 것인가? 답은 더 큰 것이 자릿수를 대표한다. (더 많은 인덱스 자리를 차지하고 있는 A 혹은 B
이제 숫자 -> 문자로 변경하는 아이디어를 알아야 된다. -> 이것은 A-‘0’ | B - ‘0’을 하면 된다. 0은 아스키코드 48을 의미하므로 0를 뺐을 때 변환된다. 왜냐하면 각 자리에는 0 ~ 9가 char로 저장되어 있다. 이 문자를 먼저 숫자로 변환해야 한다.
두 숫자의 덧셈이니 받아올림하는 수는 최대 1이다. 받아올림이 발생하면 carry는 1이고 아니면 carry는 0이다.
하지만 A와 B가 Null값일 경우 예외처리가 필요하다. Null 값일 경우 음수로 출력되기 때문이다.
코드
#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;
}