백준의 10757번 문제 큰수 A+B이다.
https://www.acmicpc.net/problem/10757
10757번: 큰 수 A+B
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
< 문제 >
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
< 예제 >

매우 큰 수를 더하는 문제이다.
원래 C++를 사용해서 풀려고 했는데 파이썬이 매우 간단하여 파이썬으로 작성하였다.
아래에 C++로 실패한 코드를 소개하도록 하고 우선 문제는 파이썬으로 풀었기 때문에 파이썬에서의 정답을 보자면
A, B = map(int, input().split())
print(A+B)
파이썬을 사용하면 2줄로 간단히 사용되는 것을 알 수 있다.
이 문제의 경우 파이썬은 오버플로우가 없어 매우 큰 수여도 그냥 더할 수 있다.
반면에 C++는 매우 큰 수를 계산할 수 없기 때문에 int형을 사용하지 않고 String을 사용해야 한다.
문제만 보고 5분안에 풀고 쉬어야지 했다가 점점 복잡해져서 결국 간단한 파이썬으로 하기로 했다.
아래에서는 C++로 어떻게 풀지 생각한게 있는데 이를 작성해보려 한다.
다른 사람들도 정답은 아니어도 이 코드에서 아이디어를 얻을 수 있다면 좋을 것 같아 작성한다.
정답코드 아님
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
string c;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int length = 0;
int length2 = 0;
if (a.length() > b.length()) {
length = a.length();
length2 = b.length();
for (int i = 1; i <= length - length2; i++) {
b += "0";
}
}
else if(a.length() == b.length()) {
length = a.length();
}
else {
length = b.length();
length2 = a.length();
for (int i = 1; i <= length - length2; i++) {
a += "0";
}
}
for (int i = 0; i <= length; i++) {
if ((a[i] - '0') + (b[i] - '0') > 9) {
a[i] = (a[i] - '0') + (b[i] - '0') - 10 + '0';
a[i + 1]++;
}
else {
a[i] = (a[i] - '0') + (b[i] - '0') + '0';
}
}
if ((a[length - 1] - '0') + (b[length - 1] - '0') > 9) {
a += '1';
reverse(a.begin(), a.end());
}
else
reverse(a.begin(), a.end());
cout << a << endl;
}
원래는 이렇게 해서 문제를 풀려고 했다.
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int length = 0;
int length2 = 0;
if (a.length() > b.length()) {
length = a.length();
length2 = b.length();
for (int i = 1; i <= length - length2; i++) {
b += "0";
}
}
else if(a.length() == b.length()) {
length = a.length();
}
else {
length = b.length();
length2 = a.length();
for (int i = 1; i <= length - length2; i++) {
a += "0";
}
}
먼저 2개의 문자열을 받아오고 문자열의 순서를 반대로 하였다.
예를들어 111222333을 받아왔다면 333222111이 되도록 하였다.

그리고 입력받은 두 문자열의 길이를 맞춰줬다.
예를들어 1111 111122가 입력되었다면 001111 111122 이렇게 되게 하였다.

for (int i = 0; i <= length; i++) {
if ((a[i] - '0') + (b[i] - '0') > 9) {
a[i] = (a[i] - '0') + (b[i] - '0') - 10 + '0';
a[i + 1]++;
}
else {
a[i] = (a[i] - '0') + (b[i] - '0') + '0';
}
}
if ((a[length - 1] - '0') + (b[length - 1] - '0') > 9) {
a += '1';
reverse(a.begin(), a.end());
}
else
reverse(a.begin(), a.end());
cout << a << endl;
그리고 여기서 문자열의 배열의 값을 각각 더했을때 10이 넘어가면 다음 문자열이 1 증가하게 하였다.
그런데 마지막 배열이 올림되었을 때 숫자가 나오지 않았다.
예제를 예로 들자면
9223372036854775807 + 9223372036854775808 = 18446744073709551615
이렇게 나와야되는데 결과값이 8446744073709551615 이렇게 나오는 것이다.
그래서 마지막에 가장 최근의 숫자끼리 더했을 때 올림이 생기면 String a에 1을 추가하게 하였다.
그런데 이렇게 하다보니 999 + 9999999 를 했을 때는 a와 b가 0000999 + 9999999이 되어서
(a[length - 1] - '0') + (b[length - 1] - '0')가 9가 나오는바람에 결과값이 제대로 나오지 않았다.
이부분만 어떻게 고치거나 위에 계산식에서 처리하면 될 것 같다.
난이도가 생각보다 높아서 봤는데 파이썬기준으로 정해져서 낮은거였다.
https://www.acmicpc.net/problem/15353
15353번: 큰 수 A+B (2)
C++17, C11, C99, C++98, C++11, C++14, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)
www.acmicpc.net
C를 사용한 문제는 위의 링크를 통해 확인할 수 있다.
혹시 이렇게 하면 될것 같거나 문제 해결 방법을 아시는 분이 계시다면 댓글로 남겨주시면 감사하겠습니다.
'백준 > 단계별' 카테고리의 다른 글
| [C++] 백준 2581 (0) | 2022.12.27 |
|---|---|
| [C++] 백준 1978 (1) | 2022.12.26 |
| [C++] 백준 2839 (0) | 2022.12.22 |
| [C++] 백준 2775 (0) | 2022.12.22 |
| [C++] 백준 10250 (0) | 2022.12.22 |