반응형



A와 B가 주어질 때 이 두 수를 더하는 코드를 작성하라.


(0 < A,B < 1010000)


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
#include <stdio.h> 
#include <string.h>
int main() {
    int max, val, carry;
    int i, ml, nl;
    char mbuf[10002], nbuf[10002];
    int  m[10002]={0,};
    int  n[10002]={0,};
    int  s[10002]={0,};
 
 
    scanf("%s",mbuf);
 
    scanf("%s",nbuf);
 
    ml=strlen(mbuf);
    nl=strlen(nbuf);
    for(i=0;i<ml;i+=1) {
        m[ml-i-1]=mbuf[i]-48;
    }
    for(i=0;i<nl;i+=1) {
        n[nl-i-1]=nbuf[i]-48;
    }
 
    max=ml;
    if(nl>ml) max=nl;
 
    carry=0;
    for(i=0;i<max;i+=1) {
        val=m[i]+n[i]+carry;
        carry=val/10;
        s[i]=val%10;
    }
    if(carry>0) {
        s[max]=carry;
        max+=1;
    }
 
 
    for(i=0;i<max;i+=1) {
        printf("%d",s[max-i-1]);
    }
 
    return 0;
}
Crocus


 

mbuf배열, nbuf배열에 string형태로 숫자를 글자로 입력받은뒤 그 문자열의 길이들을 구해줍니다.

즉 , 1234면 문자열로 1234가 저장되고 길이는 4가됩니다.


그 뒤에 for문에서 -48이 있는데 이 값은 아스키코드값으로 0이 48입니다.

따라서 1은 49이니 48을빼면 1이되는 그 값들을 n배열m배열에 넣어줍니다. 이때  n[nl-i-1]같은 뜻은 수를 거꾸로 넣어주는 의미입니다.

즉 1234로 받은 문자열을 숫자 배열에는

4321로 집어넣습니다.


그 후 더 어떤수가 더 긴지 확인하고(n,m배열중) 더 긴값을 기준으로  for문을 형성해줍니다.

1239, 123을 기준으로 한다면

val = m[i] + n[i] + carry는

9321

321 이니 

val = 9+3 + 0 

carry = 12/10 = 1

s[0] = 12%10 = 2


val = 3 + 2 + 1(1의자리에서 10이넘었으므로 값이 증가를 의미하는 carry변수입니다)

carry = 5/10 = 0

s[1] = 5%10 = 5

 

val = 2 + 1 + 0

carry = 3/10 = 0

s[2] = 3%10 = 3


val = 1 

carry = 1/10 = 0

s[3] = 1%10 = 1


이런식으로 for문을 마친후 


아래 if문에서


carry > 0이면 


s[max] = carry; 즉 for문에서 구해주지 못한 값을 더해줍니다.

이부분은 예를들어

9876

2876이면


6789

6782

이될때 9+2부분에서 1을 더 넘겨주는 방식입니다.

s[i]들의 배열이 곧 정답을 알려주는 배열입니다.

반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

문자열 뒤집기 응용  (0) 2016.03.01
1,2,3을 이용하여 값 구하기  (0) 2016.02.23
오름차순으로 수 정렬하기  (1) 2015.12.15
파도반 수열  (1) 2015.12.12
Prefix Sum (수열의 구간 합 구하기)  (1) 2015.12.06