끄적끄적 코딩
article thumbnail
Published 2019. 9. 12. 00:41
[C++] 백준 15740번 A+B - 9 알고리즘

큰 수의 덧셈 문제입니다.

일반적인 덧셈으로 하면 오버플로우가 나므로 덧셈에 대해서 새로 만들어주었습니다.

각 수의 첫번째 자리부터 더하면서 올림이 있으면 그 올림을 다음 숫자에 더해주게 만들었습니다.

첫번째 자리부터 더하는 것을 편리하게 하기 위해 string을 reverse를 통해서 뒤집어서
v[i] ~ v[x.length()-1] 까지의 숫자에 접근했습니다.

수의 길이가 다를 경우를 위해 앞에 0을 붙여주었습니다.
ex) 2000 11  => 2000 0011

-x -y의 경우 덧셈을 한 후 -를 붙여주었습니다.

-x y,  x -y의 경우 절대값이 큰 값에 작은 값을 뺀 후
절대값이 큰 값이 -일 경우 -를 붙여주었습니다.

계산 후 앞의 수에 0이 붙어있는 경우 처리해주었습니다.
ex) 0001 => 1

이 경우 0 => "" 이 되므로 ""의 경우 0을 입력받아 주었습니다.

여러가지 예외를 처리하는 문제였습니다.


 

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

int carry = 0;
int borrow = 0;
int num;
int xFlag = 0;
int yFlag = 0;
int maxSize = 0;
string x, y;
string result = "";

string zero()
{
	int count = 0;
	int i = result.length() - 1;

	while (i >= 0) {
		if (result[i] == '0') {
			++count;
			--i;
			continue;
		}
		break;
	}

	return result.substr(0, result.size() - count);
}

string sub()
{
	for (int i = 0; i < x.length(); ++i) {
		if (maxSize == 2) {
			num = ((y[i] - '0') - (x[i] - '0') - borrow);
		}
		else {
			num = ((x[i] - '0') - (y[i] - '0') - borrow);
		}
		borrow = 0;
		if (num < 0) {
			borrow = 1;
			num += 10;
		}
		result += to_string(num);
	}

	result = zero();

	if (maxSize == 2 && yFlag == 1) {
		result += '-';
	}
	else if (maxSize == 1 && xFlag == 1) {
		result += '-';
	}

	return result;
}

string sum()
{
	for (int i = 0; i < x.length(); ++i) {
		num = (x[i] - '0' + y[i] - '0' + carry) % 10;
		result += to_string(num);
		carry = (x[i] - '0' + y[i] - '0' + carry) / 10;
	}
	if (carry != 0) {
		result += to_string(carry);
	}
	if (xFlag == 1 && yFlag == 1) {
		result += '-';
	}

	return result;
}

int main(int argc, char* argv[])
{
	
	cin >> x >> y;

	if (x[0] == '-') {
		xFlag = 1;
		x = x.substr(1, x.size());
	}
	if (y[0] == '-') {
		yFlag = 1;
		y = y.substr(1, y.size());
	}

	reverse(x.begin(), x.end());
	reverse(y.begin(), y.end());

	while (x.length() < y.length()) {
		x += '0';
		maxSize = 2;
	}
	while (x.length() > y.length()) {
		y += '0';
		maxSize = 1;
	}

	if (maxSize == 0) {
		for (int i = 0; i < x.length(); ++i) {
			if (x[i] < y[i]) {
				maxSize = 2;
			}
			else if (x[i] > y[i]) {
				maxSize = 1;
			}
		}
	}

	if ((xFlag + yFlag) % 2 != 0) {
		sub();
	}
	else if ((xFlag + yFlag) % 2 == 0) {
		sum();
	}

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

	if (result == "") {
		result = '0';
	}

	cout << result;

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 15353번 큰 수 A+B (2)  (0) 2019.09.12
[C++] 백준 10757번 큰 수 A+B  (0) 2019.09.12
[C++] 백준 15666번 N과 M (12)  (0) 2019.09.11
[C++] 백준 15665번 N과 M (11)  (0) 2019.09.11
[C++] 백준 15664번 N과 M (10)  (0) 2019.09.11

검색 태그