반응형
https://www.acmicpc.net/problem/10757
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)
출력
첫째 줄에 A+B를 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int i;
//문자열을 좌우 반대로 바꿔줌. index와 자릿수를 통일하기위해
void ReverseStr(char str[]) {
char tmp;
for (i = 0; i < strlen(str) * (0.5); i++)
{
tmp = str[i];
str[i] = str[strlen(str) - i - 1];
str[strlen(str) - i - 1] = tmp;
}
}
int main() {
char a[10005] = { 0 };
char b[10005] = { 0 };
char res[10005] = { 0 }; //result. 합계
int sum;
int carry = 0;
scanf("%s %s", a, b);
ReverseStr(a);
ReverseStr(b);
int len = strlen(a) > strlen(b) ? strlen(a) : strlen(b); ////a와 b중 긴 놈의 길이
for (i = 0; i < len; i++)
{
sum = a[i] - '0' + b[i] - '0' + carry;
//a[i]나 b[i]중 하나라도 NULL일 경우 불필요한 뺄셈이 생긴다.
//빼진 '0'을 res[i]가 양수가 될 때까지 더하여 복원시켜줌.
while (sum < 0) sum += '0';
if (sum >= 10) carry = 1;
else carry = 0;
res[i] = sum % 10 + '0';
}
if (carry == 1) res[len] = '1';
ReverseStr(res);
printf("%s", res);
}
문제풀이
int 자료형은 4Byte로 (-2의 31승 ~ 2의 31승 - 1)까지 범위의 정수만 담을 수 있습니다.
이 범위를 벗어나는 큰 수를 입력 받고, 계산하여 출력하는 것이 목표이겠습니다.
따라서 전체적인 개요는 다음과 같습니다.
- %d가 아닌 %s로 문자열을 입력받습니다.
- 문자를 정수로 변환하여 계산합니다.
- 결과값을 문자로 출력합니다.
'0'의 아스키코드 값은 48이고, '1'의 아스키코드 값은 49입니다.
숫자처럼 보이는 문자를 숫자로 변환시에 '0'을 빼주는 이유입니다.
( '3' - '0' = '3' - 48 = 51 - 48 = 3 )
비고
'문자'를 c언어로 다루는 것은 항상 어렵다고 생각합니다.
(int)a[i] 와 같은 꼴로 하면 안되고, 아스키 코드의 연산을 생각하셔야합니다!!!!
반응형
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[백준][C] 2805번 나무자르기 (by 이진탐색) (0) | 2021.12.27 |
---|---|
[백준][C] 1541번 잃어버린 괄호 (0) | 2021.12.24 |
[백준][c] 2839번: 설탕 배달 (0) | 2021.07.22 |
[백준][c] 5585번: 거스름돈 (0) | 2021.07.16 |
[백준][c] 10162번: 전자레인지 (by 그리디 알고리즘) (0) | 2021.07.16 |