Programming/Algorithms

[10757번] 큰 수 A + B

찐공log 2022. 3. 24. 22:31

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

 

10757번: 큰 수 A+B

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

www.acmicpc.net

unsigned long long 으로 선언하더라도 저장할 수 없는 큰 수의 연산 문제입니다.

문제의 조건에서 주어지는 수들은 양수이기 때문에 음수의 경우는 신경쓰지 않아도 됩니다.

주어진 수의 값은 최대 \(10^{10000}\)입니다. 1뒤에 0이 1만개가 붙습니다.

 

수를 string으로 입력 받고, int형 배열로 저장한 후 각 자리수 마다 덧셈 처리를 합니다.

주의해야 할 부분은 같은 자리수의 덧셈시 9보다 커지는 경우 자리올림수 처리 입니다.

int carring = 0; 이라는 변수를 선언하여 자리올림수를 저장합니다.

 

또한 자리수 연산시 아래와 같은 예외처리문이 있습니다.

//길이가 동일한 수 a, b가 입력으로 주어졌을 때 생기는 예외처리
if (carring != 0 && i + 1 >= n) {
	n++;
}

n은 a와 b중 긴 수의 길이입니다.

덧셈 연산을 진행하는 도중에 아직 자리올림수가 남아있는데 현재 루프 i값에서 1을 더한 것이 n과 같거나 크게 되는 경우는, 길이가 동일한 수가 주어졌을 때 가장 앞자리를 더할 경우 자리 올림이 발생하는 경우여서, 정답의 길이가 n + 1가 되는 경우입니다.

그래서 그때는 n을 1 증가처리하여 for 루프를 한번 더 돌게하여 자리올림수 연산이 제대로 되도록 합니다.

또한 출력할 때는 ans 배열을 뒤집을 때 n을 더해주기만 하면 제대로 정답이 나오게 됩니다.

 

[코드]

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int A[10001];
int B[10001];
int ans[10001];
int main () {
    string a, b;
    cin >> a >> b;
    int an = a.size();
    for (int i = 0; i < an; i++) {
        A[i] = a[an - i - 1] - '0'; //일의 자리의 수부터 차례로 저장. 즉 뒤집어진 순으로 저장
    }
    int bn = b.size();
    for (int i = 0; i < bn; i++) {
        B[i] = b[bn - i - 1] - '0';
    }
    int n = max(an, bn); //두 수의 길이중 긴 값
    int carring = 0; //자리올림수 저장. 초기값 0
    for (int i = 0; i < n; i++) {
        if (A[i] + B[i] + carring > 9) { //10이상이라면 9이하의 수로 만들어주어야 한다.
            ans[i] = A[i] + B[i] + carring - 10;
            carring = 1;
        } else {
            ans[i] = A[i] + B[i] + carring;
            carring = 0;
        }
        //길이가 동일한 수 a, b가 입력으로 주어졌을 때 생기는 예외처리
        if (carring != 0 && i + 1 >= n) { 
            n++; //자리수 1 늘이기
        }
    }
    reverse(ans, ans + n); //자리수 만큼 배열 뒤집기
    for (int i = 0; i < n; i++) {
        cout << ans[i];
    }
    cout << '\n';
    return 0;
}

 

[결과]

9223372036854775807 9223372036854775808 //input
18446744073709551615

'Programming > Algorithms' 카테고리의 다른 글

[12865번] 평범한 배낭  (2) 2023.01.18
[13549번] 숨바꼭질 3  (0) 2022.07.11
[14888번] 연산자 끼워넣기  (0) 2022.02.13
[6603번] 로또  (0) 2022.02.12