/*
* ---------------------------
* 무한 자리수 계산 *
* ---------------------------
*/
#include <stdio.h>
#define CIPHER 20 /* 자리수 */
#define N ((CIPHER-1)/4+1) /* 배열크기 */
void ladd(short *,short *,short *);
void lsub(short *,short *,short *);
void print(short *);
int main(void)
{
static short a[N+2]={1999,4444,7777,2222,9999},
b[N+2]={ 111,6666,3333,8888,1111},
c[N+2];
ladd(a,b,c); print(c);
lsub(a,b,c); print(c);
return 0;
}
void ladd(short a[],short b[],short c[]) /* 긴 자리수 덧셈 */
{
short i,cy=0;
for (i=N-1;i>=0;i--){
c[i]=a[i]+b[i]+cy;
if (c[i]<10000)
cy=0;
else {
c[i]=c[i]-10000;
cy=1;
}
}
}
void lsub(short a[],short b[],short c[]) /* 긴 자리수 뺄셈 */
{
short i,brrw=0;
for (i=N-1;i>=0;i--){
c[i]=a[i]-b[i]-brrw;
if (c[i]>=0)
brrw=0;
else {
c[i]=c[i]+10000;
brrw=1;
}
}
}
void print(short c[]) /* 긴 자리수 출력 */
{
short i;
for (i=0;i<N;i++)
printf("%04d ",c[i]);
printf("\n");
}
// 긴 자리수의 덧셈, 뺄셈 : n자리의 수끼리 덧셈, 뺄셈을 수행한다.
a[]b[]의 하위자리수부터 각각 더하되 계산결과가 10000미만이면 그대로 c[]에 저장하고 10000
이상(네 자리를 넘을 경우)이면 결과 값에서 10000을 뺀 값을 저장하고, 네자리를 계산할 때
자리올림수 1을 더한다. 뺄셈도 같은 방법으로 수행하되 결과가 음수인 경우에는 10000을 더해서
c[]에 저장하고 네 자리를 계산할때 1을 뺀다.