본문 바로가기

프로그래밍/PS

[C++] 백준 10757번: 큰 수 A + B

반응형

풀이

C#에서는 BigInteger 클래스로 하면 뚝딱일 수 있지만 문제 출제의도에 벗어나기 때문에 C++로 하는 것이 바람직하다.

나는 두 큰 수를 string으로 입력받은 후 각 숫자 배열을 역순으로 해줬다.

그리고 정답을 담을 int형 리스트를 만들었다.

두 수의 각 자리별로 수를 더하고 결과의 십의 자리는 올림처리를 해주고 일의 자리를 리스트에 추가한다.

짤은 수의 끝까지 그렇게 계산하면 마지막 계산에서의 올림이 남을 수 있다.

이제 긴 수의 나머지 부분의 각 자리별로 올림처리를 계속 해주며 리스트에 추가한다.

마지막으로 남은 올림처리까지 해주면 끝.

두 수를 string으로 입력 받았기 떄문에 각 자리수가 0이 아닌 '0'처럼 저장된 것에 유의해야한다.

코드

#include <bits/stdc++.h>

using namespace std;

#define TC(T) int T; cin >> T; while(T--)
#define FAST_IO cin.tie(NULL); ios::sync_with_stdio(false);
#define FOR(i, N) for(int i = 0; i < N; ++i)
#define INF 987654321
#define ERR 1e-13
#define EL "\n"

int main() {
#ifdef DEBUG
	freopen("input.txt", "r", stdin);
	//	freopen("output.txt", "w", stdout);
#endif
	FAST_IO;

	string lhs, rhs;
	cin >> lhs >> rhs;

	lhs = string(lhs.rbegin(), lhs.rend());
	rhs = string(rhs.rbegin(), rhs.rend());

	list<int> ans;
	int cur = 0, dest = min(lhs.size(), rhs.size()), up = 0;
	for (; cur < dest; ++cur) {
		ans.push_front(lhs[cur] + rhs[cur] + up - 96);
		up = ans.front() / 10;
		ans.front() %= 10;
	}

	dest = lhs.size();
	for (; cur < dest; ++cur) {
		ans.push_front(lhs[cur] + up - 48);
		up = ans.front() / 10;
		ans.front() %= 10;
	}

	dest = rhs.size();
	for (; cur < dest; ++cur) {
		ans.push_front(rhs[cur] + up - 48);
		up = ans.front() / 10;
		ans.front() %= 10;
	}

	if (up)
		ans.push_front(up);

	for (auto& el : ans)
		cout << el;
	cout << EL;

	return 0;
}

결과

반응형