참조 : http://sirini.net/grboard2/blog/view/741
/* 이 소스코드는 기존 C 언어에서 지원하지 않는
무한자리수 산수 연산을 예시한다. 기본 데이터타입의 범위를 초과한
데이터의 덧셈과 뺄셈을 처리한다. */
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 68 69 70 71 72 73 74 75 76 77 78 79 80 | #define LIMIT 32 /* 일단 여기서는 편의상 32자리 수로 제한한다. */ #define NUM ( ((LIMIT-1) / 4) + 1 ) /* 배열 크기다. short 타입의 배열을 쓴다. */ void iAdd(short*, short*, short*); /* 덧셈 */ void iSub(short*, short*, short*); /* 뺄셈 */ void iResult(short*); /* 결과 출력용 */ int main(int args) { // 임의로 큰 수를 4자리로 short 배열에 담아두었다. // 실제 활용시에는 이 부분도 자동으로 되겠금 처리하는 게 좋다. static short a[NUM+2] = {1522,7849,2969,5432,1562,5092,8504,9562}, b[NUM+2] = { 592,1949,6040,2947,6029,1156,5892,6782}, c[NUM+2]; printf("연산대상 A: 1522,7849,2969,5432,1562,5092,8504,9562₩n"); printf("연산대상 B: 592,1949,6040,2947,6029,1156,5892,6782₩n"); printf("---------------------------------------------------₩n"); iAdd(a, b, c); printf("덧셈결과 +: "); iResult(c); iSub(a, b, c); printf("뺄셈결과 -: "); iResult(c); return 0; } // 긴 자리 덧셈하기 void iAdd(short a[], short b[], short c[]) { short i, cy=0; // 배열의 뒷자리부터 (그러니까 작은 단위수부터) 한 인덱스씩 계산한다. // 한 블럭의 덧셈결과가 10000 을 넘게 되면 자리올림수 처리를 해준다. (cy) for (i=NUM-1; i>=0; i--) { c[i] = a[i] + b[i] + cy; // 4자리수끼리 덧셈을 했는데도 10000 을 못넘겼으면 자리올림수는 없다! if(c[i] < 10000) cy = 0; else { c[i] = c[i] - 10000; cy = 1; // 덧셈해서 10000 을 넘겼다면 자리올림수를 만든다. // 위에서 만들어진 자리올림수는 그대로 다음 루프문에서 반영된다. } } } // 긴 자리수 뺄셈하기 void iSub(short a[], short b[], short c[]) { short i, br=0; // 역시 배열의 뒷자리 블럭부터 4자리씩 끊어서 계산한다. for (i=NUM-1; i>=0; i--) { c[i] = a[i] - b[i] - br; // 4자리수 뺄셈해서 결과가 0 이거나 혹은 0보다 크면 자리내림수는 없다! if (c[i] >= 0) br = 0; else { c[i] = c[i] + 10000; // 0보다 작게 되었다면 10000 을 빌리고 br = 1; // 대신 그 윗자리수에서 1을 뺀다. 등가교환법칙 } } } // 출력용 void iResult(short c[]) { short i; // 저장된 배열을 역시 4자리씩 끊어서 보여준다. for (i=0; i<NUM; i++) printf("%04d ", c[i]); printf("₩n"); } | cs |
'Programming > Algorithm' 카테고리의 다른 글
[자료구조] TRIE 예제 코드 (0) | 2017.12.06 |
---|---|
원하는 개수의 순열 구하기 (0) | 2016.04.01 |
알고리즘 학습 사이트 (0) | 2016.03.24 |
길찾기 알고리즘(0 에서 99로 갈 수 있는지 확인) (0) | 2016.03.11 |
멱집합(부분집합) 응용, 조건에 따라 불필요한 부분집합 제거 (0) | 2016.03.10 |