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 |