[백준 10757] 큰 수 A+B

백준 10757번 - 큰 수 A+B

백준 10757번

❓ 문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

정말 단순한 문제로 보였으나 아니었다.
unsigned long long int 로 해결하려 하였으나, 그것보다 더 큰 수는 어떻게 계산하는가?

우선, unsigned long long int는 8바이트로 0~18,446,744,073,709,551,615의 범위가 표현 가능하다.
우리는 이 밖의 더 큰 수에 대해 어떻게 계산할까??


✏️ 풀이

vector로 해결하였다.

  1. input을 string으로 받는다.
  2. vector에 받은 string의 index를 넣는다
    • 이 때, 자릿수가 얼마나 들어올 지 모르므로, string의 마지막 index부터 역순으로 vector에 push한다.
    • int 자료형이므로 각 자리의 char에 -48을 적용해준다 (ASCII Code로 48은 숫자 0이다)
    • ex) input:1234, 1이면 벡터에는 4321, 1로 들어감.
  3. 덧셈은 각 벡터 인덱스끼리 더해주면 됨.
    • result vector를 한 개 더 사용함.
    • 두 벡터를 더했을 때, carry가 생기면(10 이상이면) 다음 index에 1을 더 더해주는 것으로 처리함.
  4. 역순으로 출력
    • 위의 과정까지 끝나면, 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