문자열로 입력 받아서 덧셈을 하는 코드를 짠다. 주의사항은 아래와 같다. - 양수에는 부호가 없지만, 음수에는 - 부호가 있다. - 부호가 같으면 덧셈, 부호가 다르면 뺄셈을 한다. - 0은 항등원이므로 입력값에 0이 포함되는 경우에는 연산을 할 필요가 없다.
일단 양수, 0에는 부호가 없으므로 이런 숫자가 입력으로 들어오면 앞에 +를 붙여준다.
덧셈은 각 자리를 합한 뒤 10이 넘으면 다음 자리에 +1을 하고, 현재 자리에 10을 빼기만 하면 된다. 뺄셈은 계산 결과에 따라 추가적으로 처리해야 할 것들이 있다.내 경우에는 아래와 같은 순서로 진행하였다. 1. 음수인 배열의 각 자리에 -1을 곱한다. 2. A와 B의 각 자리를 합한다. 3. 합한 결과의 맨 앞이 0인 경우 0이 아닌 수가 나올 때까지 제거한다. 4. 맨 앞의 수가 0보다 작은 경우 부호를 -로 하고 각 자리에 -1을 곱한다. 아닌 경우에는 부호를 +로 한다. 5. 일의 자리부터 시작하여 0보다 작은 경우 앞의 자리 수를 1 빼고, 현재 자리 수에 +10을 한다. 6. 조정 후 3.의 처리를 추가로 진행한다.
마지막으로 결과 출력이 char로 이루어지므로 각 자리에 '0'을 더해줘 정상적으로 출력될 수 있게 하고, 부호가 +일 경우 이를 제거해준다.
2019. 11. 05 - 0에 대한 예외처리 추가 기존: 값이 0일 때도 연산 진행 변경: 입력 값에 0이 포함되는 경우 다른 값을 반환
2019. 10. 21 - 앞에 위치한 0 제거 코드 수정 기존: 맨 앞이 0인지 확인하여 erase. 0의 개수만큼 erase 함수 반복. 변경: 맨 앞이 0일 경우 연속으로 0이 나오는 수량을 확인하여 범위 삭제. erase 함수는 1회만 실행하는 대신 연속으로 확인하는 과정에서 for문이 돌아감
풀이 코드
#include <iostream>
using namespace std;
void BAEKJOON_15740()
{
string A;
string B;
cin >> A >> B;
// 입력 값이 0인 경우에 대한 예외처리
if (A == "0")
{
cout << A << endl;
}
else if (B == "0")
{
cout << B << endl;
}
// 음수가 아닌 경우 앞에 부호 추가
if (A[0] != '-')
{
A.insert(A.begin(), '+');
}
if (B[0] != '-')
{
B.insert(B.begin(), '+');
}
// 두 수의 합이 0인 경우
if (A[0] != B[0] && A.length() == B.length())
{
bool check = true;
for (size_t i = 1; i < A.length() && check; i++)
{
if (A[i] != B[i])
{
check = false;
break;
}
}
if (check)
{
cout << 0 << endl;
return;
}
}
// A가 긴 문자열, B가 짧은 문자열
if (A.length() < B.length())
{
A.swap(B);
}
A.resize(A.length(), 0);
// char to int
for (size_t i = 1; i < A.length(); i++)
{
A[i] -= '0';
}
for (size_t i = 1; i < B.length(); i++)
{
B[i] -= '0';
}
// 둘의 부호가 같은 경우
if (A[0] == B[0])
{
// 각 자리 별 계산
size_t gap = A.length() - B.length();
for (size_t i = 1; i < B.length(); i++)
{
A[gap + i] += B[i];
}
for (int i = A.length() - 1; i >= 2; i--)
{
if (A[i] >= 10)
{
A[i - 1]++;
A[i] -= 10;
}
}
if (A[1] >= 10)
{
A[1] -= 10;
A.insert(A.begin() + 1, 1);
}
}
// 둘의 부호가 다른 경우
else
{
// 음수인 수의 각 자리에 -1 곱하기
if (A[0] == '-')
{
for (size_t i = 1; i < A.length(); i++)
{
A[i] *= -1;
}
}
else
{
for (size_t i = 1; i < B.length(); i++)
{
B[i] *= -1;
}
}
// 각 자리별 계산
size_t gap = A.length() - B.length();
for (size_t i = 1; i < B.length(); i++)
{
A[gap + i] += B[i];
}
// 계산 후 앞에 위치한 0 제거
if (A[1] == 0)
{
int zeroCount = 0;
for (int i = 1; A[i] == 0; i++)
{
zeroCount++;
}
A.erase(A.begin() + 1, A.begin() + zeroCount + 1);
}
// 부호에 따른 조정
if (A[1] < 0)
{
A[0] = '-';
for (size_t i = 1; i < A.length(); i++)
{
A[i] *= -1;
}
}
else
{
A[0] = '+';
}
// 각 자리 조정
for (int i = A.length() - 1; i >= 2; i--)
{
if (A[i] < 0)
{
A[i - 1]--;
A[i] += 10;
}
}
// 조정 후 0 제거
if (A[1] == 0)
{
int zeroCount = 0;
for (int i = 1; A[i] == 0; i++)
{
zeroCount++;
}
A.erase(A.begin() + 1, A.begin() + zeroCount + 1);
}
}
for (size_t i = 1; i < A.length(); i++)
{
A[i] += '0';
}
if (A[0] == '+')
{
A.erase(A.begin());
}
cout << A << endl;
return;
}