작성일 :

문제 링크

26711번 - A+B

설명

얼핏 보면 단순히 두 개의 숫자를 더하는 프로그램을 작성하는 문제로 보입니다.

하지만, 문제의 설명에 따르면 입력으로 주어지는 숫자가 최대 5000 개의 자릿수를 가진다는 조건이 있습니다.
즉, C++ 언어의 표준 라이브러리로는 숫자를 표현할 수 있는 방법에 한계가 있습니다.
따라서, 외부 라이브러리를 사용하지 않고 C++ 언어로 해당 문제를 풀이하기 위해서는, 문자열을 이용하여 덧셈을 직접 구현해야 합니다.

반면에, C# 언어에서는 System.Numerics 네임스페이스에 정의되어 있는 BigInteger 자료형을 통해 쉽게 해결할 수 있습니다.
C# 언어에서 해당 BigInteger 자료형은 크기에 제한에 없기 때문에, 사용 가능한 메모리가 허용하는 한에서 어떠한 크기의 정수라도 저장할 수 있습니다.

따라서, 아래의 코드 중 C# 언어를 이용한 풀이에서는 BigInteger 자료형을 활용하였고,
C++ 언어를 이용한 풀이에서는 문자열을 이용해 직접 덧셈을 구현하여 풀이하였습니다.


Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace Solution {

  using System.Numerics;

  class Program {
    static void Main(string[] args) {

    var a = BigInteger.Parse(Console.ReadLine()!);
    var b = BigInteger.Parse(Console.ReadLine()!);

    Console.WriteLine(a + b);

    }
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>

using namespace std;

string addNums(const string& a, const string& b) {
  string ret = "";

  int carryOver = 0, lenA = a.length(), lenB = b.length();

  while (true) {
    if (lenA <= 0 && lenB <= 0) break ;

    int numA = 0, numB = 0;
    if (lenA > 0) numA = a[lenA - 1] - '0';
    if (lenB > 0) numB = b[lenB - 1] - '0';

    int sum = numA + numB + carryOver;
    carryOver = sum / 10;
    ret += (sum % 10) + '0';

    if (lenA > 0) lenA--;
    if (lenB > 0) lenB--;
  }

  if (carryOver > 0) ret += carryOver + '0';

  reverse(ret.begin(), ret.end());

  return ret;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  string a, b; cin >> a >> b;

  cout << addNums(a, b) << "\n";

  return 0;
}