[백준 10757] 큰 수 A+B
백준 10757번 - 큰 수 A+B
❓ 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
정말 단순한 문제로 보였으나 아니었다.
unsigned long long int 로 해결하려 하였으나, 그것보다 더 큰 수는 어떻게 계산하는가?
우선, unsigned long long int는 8바이트로 0~18,446,744,073,709,551,615
의 범위가 표현 가능하다.
우리는 이 밖의 더 큰 수에 대해 어떻게 계산할까??
✏️ 풀이
vector로 해결하였다.
- input을 string으로 받는다.
- vector
에 받은 string의 index를 넣는다 - 이 때, 자릿수가 얼마나 들어올 지 모르므로, string의 마지막 index부터 역순으로 vector
에 push한다. - int 자료형이므로 각 자리의 char에 -48을 적용해준다 (ASCII Code로 48은 숫자 0이다)
- ex) input:1234, 1이면 벡터에는 4321, 1로 들어감.
- 이 때, 자릿수가 얼마나 들어올 지 모르므로, string의 마지막 index부터 역순으로 vector
- 덧셈은 각 벡터 인덱스끼리 더해주면 됨.
- result
vector를 한 개 더 사용함. - 두 벡터를 더했을 때, carry가 생기면(10 이상이면) 다음 index에 1을 더 더해주는 것으로 처리함.
- result
- 역순으로 출력
- 위의 과정까지 끝나면, input 1234와 1을 더했을 때, 4321과 1의 벡터를 더하게 된 것이므로 합은 5321이 나온다.
- 따라서 역순으로 출력하면 원하는 결과를 얻을 수 있다.
✔️ 정답 코드
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string a,b;
void answer();
void init_num1(string a); // num1 벡터 초기화 함수
void init_num2(string b); // num2 벡터 초기화 함수
vector<int> num1;
vector<int> num2;
vector<int> result;
void sum();
int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> a >> b;
// 역순으로 push
init_num1(a);
init_num2(b);
// 각 자릿수 더하기
sum();
// reverse로 정답 도출
answer();
return 0;
}
void sum() {
int count=0;
int carry=0; // 10이상일 경우 carry 값
while(1) {
if (num1.size()-1 < count && num2.size()-1 < count && carry==0)
break;
int temp=0;
temp+=carry;
carry=0;
if (num1.size()-1 >= count) // 배열이 존재함
temp+=num1[count];
if (num2.size()-1 >= count) // 배열이 존재함
temp+=num2[count];
if (temp>=10) // 10이상일 경우 carry 발생
carry=temp/10;
result.push_back(temp%10);
count++;
}
}
void answer() {
reverse(result.begin(), result.end());
vector<int>::iterator it;
for (it = result.begin(); it!=result.end(); it++)
cout << *it;
}
void init_num1(string a) {
for (int i = a.length()-1 ; i >= 0 ; i--)
num1.push_back(a[i]-48);
}
void init_num2(string b) {
for (int i = b.length()-1 ; i >= 0 ; i--)
num2.push_back(b[i]-48);
}
Leave a comment