Giken Dev
article thumbnail
반응형

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

 

10757번: 큰 수 A+B

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

www.acmicpc.net

문제

두 정수 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)까지 범위의 정수만 담을 수 있습니다. 

이 범위를 벗어나는 큰 수를 입력 받고, 계산하여 출력하는 것이 목표이겠습니다.

따라서 전체적인 개요는 다음과 같습니다.

  1. %d가 아닌 %s로 문자열을 입력받습니다.
  2. 문자를 정수로 변환하여 계산합니다.
  3. 결과값을 문자로 출력합니다.

 

'0'의 아스키코드 값은 48이고, '1'의 아스키코드 값은 49입니다.

숫자처럼 보이는 문자를 숫자로 변환시에 '0'을 빼주는 이유입니다.

( '3' - '0' = '3' - 48 = 51 - 48 = 3 )

비고

'문자'를 c언어로 다루는 것은 항상 어렵다고 생각합니다. 

(int)a[i] 와 같은 꼴로 하면 안되고, 아스키 코드의 연산을 생각하셔야합니다!!!!

반응형
profile

Giken Dev

@기켄

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!