산타는 없다

[백준 / BAEKJOON] 10757번 큰 수 A+B - C++ 본문

코딩테스트/백준

[백준 / BAEKJOON] 10757번 큰 수 A+B - C++

LEDPEAR 2021. 1. 10. 20:52
반응형

문제 원문

문제

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

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10¹⁰⁰⁰⁰)

출력

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

예제

 

풀이

자릿수가 10의 만 제곱이기 때문에 Integer 자료형으로는 처리할 수 없고
string이나 int나 char의 배열을 사용해야 하는데 저는 string을 사용하여 풀었습니다

입력받은 각 문자열의 맨 뒤부터 시작하여 전체 순회하였으며 먼저 끝나는 수에 대한 예외처리를 해주었습니다.

계산은 각 문자열 자릿수와 carry값을 더하는 것으로 진행하였고
계산한 값이 10 이상이면 carry을 true 처리하여 자리 올림수를 처리하였습니다.

문자열을 모두 순회한 후 마지막 carry값이 true일 경우 자리 올림수 처리를 마저 진행해 주었습니다.

성공 코드

#include <vector>
#include <iostream>
#include <string>

using namespace std;

int main()
{
	string a, b;
	ios_base::sync_with_stdio(0); 
	cin.tie(0);
	cin >> a >> b;

	int a_pos = a.size() - 1;
	int b_pos = b.size() - 1;

	int a_num, b_num, temp;
	bool bCarry = false;

	string strResult = "";

	while (a_pos >= 0 || b_pos >= 0)
	{
		if (a_pos < 0)	//문자열 a 값 저장 및 예외처리
			a_num = 0;
		else
			a_num = a[a_pos--] - '0';

		if (b_pos < 0)	//문자열 b 값 저장 및 예외처리
			b_num = 0;
		else
			b_num = b[b_pos--] - '0';

		temp = a_num + b_num + bCarry;	// 저장할 값 계산

		if (temp >= 10)					// Carry값 계산
		{
			temp -= 10;
			bCarry = true;
		}
		else
			bCarry = false;

		strResult = to_string(temp) + strResult;	//문자열 저장
	}

	if (bCarry)	//만약 마지막 연산에서 Carry값이 있을경우 자리올림수 처리
	{
		strResult = "1" + strResult;
	}

	if (strResult == "")
		strResult = "0";

	cout << strResult << endl;

	return 0;
}

결과

반응형
Comments