본문 바로가기

백준

10757)큰 수 A+B

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


두 수를 더해 그 결과를 출력하는 쉬운 문제처럼 보이지만 더하는 두 수가 10^10000보다 작다.


int나 long long 타입으로 위처럼 큰 수를 다룰 수 없기 때문에 문자열로 처리해야 한다.


두 수의 합을 구현하려면 sum과 carry를 고려해야 한다.


두 수의 길이가 어떻든 맨 마지막 자리수 끼리 맞추고 각 자리수들을 더한다.


예를 들어 1234 + 987을 더할 때 가장 마지막 자리끼리 더하면 sum = 11이다.


sum>10이므로 carry가 발생했다.  sum에서 10을 빼주고 carry에 1을 대입한다.


sum을 result 배열에 넣어준다.


두 번째 자리를 더하면 sum = 3+8+carry 이므로 sum = 12이다.


sum>10이므로 sum에서 10빼주고 carry에 1을 대입한다.


sum을 result 배열에 넣어준다.


대충 이런식으로 동작하는데 두 수의 길이가 같고 가장 첫번째 자리를 더할 때 carry가 발생하면 문제가 생길 수 있다.


예를들어 9999+9999의 결과는 5자리이다. result의 길이도 5자리가 되어야 한다.


하지만 가장 끝 자리부터 더해가므로 첫 번째 자리수 끼리 합이 carry를 발생시키는 지는 모른다.


그래서 충분한 크기의 result 배열의 첫 번째 방부터 차례대로 각 자릿수의 합을 집어 넣으면 된다.


그리고 역순으로 결과를 출력하면 끝.


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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<stdio.h>
#define A 0
#define B 1
 
int calLength(char *str) {
    int length = 0;
 
    for (int i = 0; str[i] != NULL;i++) {
        length++;
    }
 
    return length;
}
 
int main() {
    char strA[10001], strB[10001], result[10002];
    int len[2];
    int longer, shorter;
    int t = 0,i, j;
    int sum, carry = 0;
 
    scanf("%s %s",strA,strB);
    
    len[A] = calLength(strA);
    len[B] = calLength(strB);
 
    if (len[A]>len[B]) {
        longer = A, shorter = B;
    }
    else longer = B, shorter = A;
 
    i = len[longer] - 1,j = len[shorter] - 1;
    while (i>=0) {
        sum = 0;
 
        if (longer == A) {
            if (i >= 0) sum += strA[i] - '0';
            if (j >= 0) sum += strB[j] - '0';
        }
        else {
            if (i >= 0) sum += strB[i] - '0';
            if (j >= 0) sum += strA[j] - '0';
        }
        sum += carry;
        if (sum > 9) sum -= 10, carry = 1;
        else carry = 0;
        result[t++= sum + '0';
        
        i--,j--;
    }
 
    if (carry > 0) {
        result[t] = carry + '0';
        len[longer]++;
        result[len[longer]] = NULL;
    }
    else {
        result[len[longer]] = NULL;
    }
 
    for (int i = len[longer] - 1; i >= 0;i--) {
        printf("%c",result[i]);
    }
    printf("\n");
 
    return 0;
}
cs


'백준' 카테고리의 다른 글

2667)단지 번호 붙이기  (0) 2019.02.20
2965)캥거루 세 마리  (0) 2019.02.19
15501)부당한 퍼즐  (0) 2019.02.18
16396)선 그리기  (0) 2019.02.17
14891)톱니바퀴  (0) 2019.02.16