728x90
큰 수의 덧셈 문제입니다.
일반적인 덧셈으로 하면 오버플로우가 나므로 덧셈에 대해서 새로 만들어주었습니다.
각 수의 첫번째 자리부터 더하면서 올림이 있으면 그 올림을 다음 숫자에 더해주게 만들었습니다.
첫번째 자리부터 더하는 것을 편리하게 하기 위해 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 |