[BEAKJOON] 10757_큰 수 A+B_C언어

SW 업무 관련/백준

[BEAKJOON] 10757_큰 수 A+B_C언어

WillBe_ 2017. 8. 10. 20:54


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


풀이

풀이라고할 것도 없다. 이건 그냥 아래 블로그의 답을 보고 이해한 다음 고대로 베꼇다.


http://programmerchoo.tistory.com/40


구성은 크게 두 부분으로 나뉜다.

1. 배열 reverse

Ex) 987 -> 789


2. 두 문자열 배열의 합

reverse된 문자열의 합. 만약 올림수가 발생하면 다음 배열에 +1을 해준다.


처음 그림은 입력받은 문자열 A와 B이다. 그리고 A+B이다. A+B의 경우 올리수가 발생하면 배열 전체를 뒤로 밀어야되어 번거롭다.


그래서 Reverse함수를 만들어서 배열의 압뒤를 바꾸어준다. 그 뒤 두 배열을 더해주면 올림수가 발생하여도 다음 인덱스에 +1만 해주면 되기 때문에 매우 간편하다.


다음으로 출력전에 다시 reverse된 A+B배열을 reverse함수를 사용하여 복원시켜주면된다.





제출한 코드


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
#include <stdio.h>
#include <string.h>
#define StoD(X) (X==0?0:X-'0')
 
char a[100000], b[100000],S[100000];
void reverse(char *int);
char * add(char * , char *);
 
int main()
{
    scanf("%s %s",a,b);
    printf("%s",add(a,b));
 
    return 0;
}
 
 
void reverse(char * arr, int len)
{
    char temp;
 
    for (int i = 0; i < len / 2; i++)
    {
        temp = arr[i];
        arr[i] = arr[len - 1 - i];
        arr[len - 1 - i] = temp;
    }
    return;
}
 
char * add(char * A, char * B)
{
    int len = 0, up = 0;
 
    if (strlen(A) > strlen(B))
        len = strlen(A);
    else
        len = strlen(B);
 
    reverse(A, strlen(A));
    reverse(B, strlen(B));
 
    for (int i = 0; i <= len; i++)
    {
        S[i] = (StoD(A[i]) + StoD(B[i]) + up) % 10 + '0';
        if ((StoD(A[i]) + StoD(B[i]) + up) > 9)up = 1;
        else up = 0;
    }
    if (S[len] == '0') S[len] = 0;
 
    reverse(S, strlen(S));
 
    return S;
}
cs





'SW 업무 관련 > 백준' 카테고리의 다른 글

[BEAKJOON]1520_내리막길_C언어  (0) 2017.08.12
[BEAKJOON] 1057_토너먼트_C언어  (0) 2017.08.12
[BEAKJOON] 5427_불_C언어  (0) 2017.08.09
[BEAKJOON] 1074_Z_C언어  (0) 2017.08.09
[BEAKJOON] 3055_탈출_C언어  (0) 2017.08.07