[10757] 큰 수 A+B

Byeongmin·2021년 6월 6일
0
post-thumbnail

[10757] 큰 수 A+B

문제

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

입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

출력

첫째 줄에 A+B를 출력한다.

코드

#include <iostream>
#include <string.h>

using namespace std;

int main() {
    string A, B, tmp; // 0 < A, B < 10^10000
    char C[10000]; // 마지막 배열은 null
    bool carry = 0; // adder의 carry

    cin >> A >> B;

    // A를 긴자리 숫자로
    if(A.length() < B.length()) {
        tmp = A;
        A = B;
        B = tmp;
    }

    // LD: Long Digit, 긴 숫자 자리수
    // SD: Short Digit, 짧은 숫자 자리수
    int LD = A.length();
    int SD = B.length();

    // 마지막에 string으로 출력해주기 위해 null추가
    C[LD] = '\0';

    for(int i = 1; i <= LD; i++) {
        if(i <= SD) { // 짧은 숫자 + 긴 숫자
            C[LD - i] = ((A[LD - i] - '0') + (B[SD - i] - '0') + carry) % 10 + '0';
            if((A[LD - i] - '0') + (B[SD - i] - '0') + carry >= 10) carry = 1;
            else carry = 0;
        } else { // 더이상 더할 짧은 숫자가 없을 때
            if((A[LD - i] - '0') + carry < 10) {
                C[LD - i] = A[LD - i] + carry;
                carry = 0;
            } else {
                C[LD - i] = ((A[LD - i] - '0') + carry) % 10 + '0';
                carry = 1;
            }
        }
    }

    if(carry == 1) printf("1"); // 최고 자리수 덧셈이 10을 넘어갔을 때
    printf("%s\n", C);
}

부가 설명

숫자가 너무 큰 숫자(0 < A, B < 10^10000)였기 때문에, unsinged long long int 를 사용해도 풀 수가 없는 문제여서 char배열을 이용해 풀어야 했다.

최대 9999자리 숫자이므로 배열 C[10000]을 만들어 A + B를 char로 채웠다.
채운 방식은 A > B인 string을 만들고, 뒤에서부터 A[i], B[i]와 carry(덧셈에서 올림)를 더해 C[i]에 채워주었다.
(이 때, 위의 A[i]와 B[i]의 i는 자릿수가 다르면 다른 숫자이다)
만일 B는 최대 자리수까지 더했는데 A에 숫자가 남았다면 carry와 함께 C[i]를 채워줬다.
마지막에 carry가 1이 남을 경우 A의 최대 자리숫자에서 carry가 발생한 것이므로 1과 함께 C를 출력해주었고 아니면 그냥 C를 출력해주었다.

출처 : https://www.acmicpc.net/problem/10757

profile
Handong Global Univ.

0개의 댓글