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 |