[백준] 큰수 A+B
업데이트:
문제
문제해결 과정
- 그냥 입력받은 두 개의 정수 값을 더하는 간단한 문제이다.
- 하지만, 입력받을 수 있는 범위가 매우 크다는 것이 문제다.
- C++이나 Java에서 int는 약 21억 정도의 최대 범위를 갖기 때문에, int 자료형으로 입력값을 받아 이 문제를 해결한다면
오버플로우
가 발생할 것이다. (long 타입도 마찬가지) -
python3 같은 경우에는 아무리 큰 정수를 변수에 저장하더라도 오버플로우를 발생시키지 않기 때문에 다음과 같은 코드로 간단하게 이 문제를 해결할 수 있다.
A, B = map(int, input().split()) print(A+B)
- 또는, Java에서도 큰수를 저장할 수 있는
BigInteger
와 같은 타입을 제공한다. - 하지만, 이러한 언어적 장점을 활용하여 문제를 해결할 수도 있겠지만, 이러한 방식으로 해결하는 것이 정말 이 문제의 의도라고 생각하지는 않는다.
- 그렇다면, 굉장히 큰 수를 안전하게 저장하기 위해 사용할 수 있는 자료형으로는 어떤것이 있을까?
-
다음과 같이 숫자를 자리수 하나하나
배열
로 넣어서 계산하면 되지 않을까? - 그리고 또 하나 주의해야할 점은 문제에서 입력받는 두 정수의 자리수가 서로 다를 수 있다는 것이다.
-
이럴때는, 두 정수 중 더 큰 자리수의 길이에 맞게 배열을 할당받아 작은 정수를 입력받고 남는 부분은 0으로 채워넣는 방식으로 저장하는 것이 계산하기에 편리할 것이다.
- 덧셈을 수행할 때, 마지막 자리수(배열의 마지막요소)부터 거꾸로 계산 하면서, 올림수를 각 자릿수 덧셈을 수행할때마다 잘 계산하면 원하는 결과를 얻을 수 있을 것이다.
코드
#include<string>
#include<iostream>
#include<vector>
using namespace std;
string A,B;
int a,b,carry=0;
vector<char> ret;
int main() {
cin>>A>>B;
int a_size=A.size(),b_size=B.size();
if (a_size>b_size) {
int diff = a_size-b_size;
while(diff--) B='0'+B;
} else {
int diff = b_size-a_size;
while(diff--) A='0'+A;
}
int t_size=A.size();
for (int i=t_size-1;i>=0;i--) {
a=A[i]-'0';
b=B[i]-'0';
int val=(a+b+carry)%10;
carry=(a+b+carry)/10;
ret.push_back(val+48);
}
if (carry>0) ret.push_back(carry+48);
for (int i=ret.size()-1;i>=0;i--) {
cout<<ret[i];
}
printf("\n");
return 0;
}
댓글남기기