본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 10757번: 큰 수 A+B -C++

728x90

[백준알고리즘] 10757번: 큰 수 A+B -C++

10757번: 큰 수 A+B (acmicpc.net)

 

10757번: 큰 수 A+B

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

www.acmicpc.net

이번 문제는 숫자를 읽을 수 없는 범위에서 연산까지 하는 문제다.

예전에 파이썬으로 소수점 아래를 연산할 때 경험해본 적 있는 타입의 문제였다.. 그때는 문제를 결국 풀었는지 어쨌는지 기억이 나지는 않지만.. 그때의 기억 덕분에 문제를 쉽게 풀었다.

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다


사실 이렇게 큰 숫자를 int, double과 같은 type으로 입력받을 수는 없다. 또는 연산을 통해서 나온 값을 저장할 수도 없다.

 

한 가지 입력받을 수 있는 경우는 "문자열"로 인식할 때다.

 

그래서 std::string 타입을 선언하고 string 타입으로 읽어옴으로써 수를 문자열로 읽을 수 있다.

 

그리고.. 덧셈 연산은.. 우리가 실제로 덧셈을 할 때 올림 하고 자릿수마다 더하는 과정을 반복해줬다.

 

그러기 위해서 더 길이가 큰 값이 기준이 될 필요가 있었고, 항상 a에 길이가 더 긴 문자열(숫자)이 입력되게만 해주었다. 그 외에는 반복문을 통해서 문자열의 각 자릿수마다 더해주고 올림을 해주는 과정을 반복했다.

 

#include <iostream>

void solve(void);

int main(void)
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);

	solve();
}

void solve(void)
{
	std::string a, b;
	std::cin >> a >> b;

	if (a.size() < b.size())
		swap(a, b);
	
	int carry = 0;
	std::string answer;
	for (int i = 1; i <= a.size(); i++)
	{
		int index_a = a.size() - i;
		int index_b = b.size() - i;
		char char_a = a[index_a];
		char char_b = (index_b < 0 ? '0' : b[index_b]);

		int new_num = (char_a - '0') + (char_b - '0') + carry;
		carry = (10 <= new_num) ? new_num / 10 : 0;
		char remain = (new_num % 10) + '0';
		answer = remain + answer;
	}
	if (carry)
		answer = char(carry + '0') + answer;
	std::cout << answer;
}

 

728x90