💻코딩테스트/백준

[백준/C++] 10757번 : 큰 수 A+B - unsigned long long을 넘는 자료형의 덧셈(string)

공대 컴린이 2023. 5. 30. 20:06
728x90

큰 수 A+B 

문제

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

입력

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

출력

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

예제 입력 1 

9223372036854775807 9223372036854775808

예제 출력 1 

18446744073709551615

해당 문제는 unsigned long long 자료형의 범위를 훨씬 뛰어넘는 큰 숫자들의 덧셈을 구현하는 문제이다.

 

그어떤 정수형 자료형으로도 범위를 나타낼 수 없으므로 string으로 숫자를 입력받은 뒤 각 자릿수의 덧셈을 순정으로 구현해주어야 이 문제를 해결할 수 있다. (너무 어려웠다..)

 

#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>

using namespace std;

int main()
{
	vector<int> result;
	string A, B;
	
	cin >> A >> B;

	// A를 (자릿수가)더 큰수로 변경
	if(A.length() < B.length())
	{
		string temp = A;
		A = B;
		B = temp;
	}

	vector<int> aNum(A.length());
	vector<int> bNum(A.length());

	for(int i = 0; i < aNum.size(); i++)
	{
		aNum[i] = A[i] - '0';
		if (i < B.size())
			bNum[A.size()-B.size()+i] = B[i] - '0';
	}

	//cout << "A : " << A << endl;
	//cout << "B : " << B<< endl;

	for(int i = aNum.size()-1; i >= 0; i--)
	{
		int sum = aNum[i] + bNum[i];
		if (sum >= 10)
		{
			sum -= 10;
			if (i - 1 < 0)
			{
				result.push_back(sum);
				result.push_back(1);
				break;
			}
			aNum[i - 1]++;
		}
		result.push_back(sum);
	}

	reverse(result.begin(), result.end());

	for (int num : result)
		cout << num;
	cout << endl;

	return 0;
}

 

1. 숫자 A와 B를 각각 string 자료형에 저장하였다.

2. 자릿수가 더 큰 숫자가 무조건 A 변수에 위치하도록 하였다.

3. 더 큰 수인 A의 길이만큼 vector<int>를 각각 생성하여 A와 B의 각 자릿수를 int형으로 저장해두었다.

이때, B의 자릿수가 부족하다면 빈 자리에는 0을 채워두도록 자릿수를 맞춰서 인덱스를 추가하였다.

4. 두 수의 끝자리부터 더한 후 합이 10을 넘어가는 경우 앞자릿수에 1을 더하고 10을 뺀 뒷자릿수는 Result 배열에 Push_Back 하였다.

5. 모든 자릿수의 연산이 끝난 후 Result 배열에는 숫자들이 거꾸로 배치되어있기 때문에 Reverse를 이용해 뒤집어준 뒤 출력하였다.

728x90