多桁計算による四則演算

多桁計算に関しては数値計算の教科書等を参照ですかね^^.今回はあくまで例題ということで..

多桁計算による四則演算(list_90.c)
#include <stdio.h>

#define ORDER 20
#define N ((ORDER-1)/4+1)

//-----------------------------------------------------------------
void ladd(short* a, short* b, short* c);
void lsub(short* a, short* b, short* c);
void lmul(short* a, short b, short* c);
void ldiv(short* a, short b, short* c);
void print(short* c);
//-----------------------------------------------------------------

int main()
{
    static short a[N+2] = {  10,4444,7777,2222,9999};
    static short b[N+2] = { 111,6666,3333,8888,1111};
    static short c[N+2];

    printf("      a = "); print(a);
    printf("      b = "); print(b);
    printf("  a + b = "); ladd(a,b,c);   print(c);
    printf("  a - b = "); lsub(a,b,c);   print(c);
    printf("a * 101 = "); lmul(a,101,c); print(c);
    printf("a / 200 = "); ldiv(a,200,c); print(c);
    
    return 0;
}

void ladd(short* a, short* b, short* c)
{
    short cy=0;
    for(int 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 brrw=0;
    for(int 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 lmul(short* a, short b, short* c)
{
    long d,cy=0;
    for(int i=N-1; i>=0; i--){
        d = a[i];
        c[i] = (d*b+cy)%10000;
        cy = (d*b+cy)/10000;
    }
}

void ldiv(short* a, short b, short* c)
{
    long d,rem=0;
    for(int i=0; i<N; i++){
        d = a[i];
        c[i] = (d+rem)/b;
        rem = ((d+rem)%b)*10000;
    }
}

void print(short* c)
{
    for(int i=0; i<N; i++) printf("%04d ",c[i]);
    printf("\n");
}

実行結果
Gami[330]% ./list_90.exe
       a = 0010 4444 7777 2222 9999 
       b = 0111 6666 3333 8888 1111 
   a + b = 0122 1111 1111 1111 1110 
   a - b = 9898 7778 4443 3334 8888 
 a * 101 = 1054 8922 5499 4522 9899 
 a / 200 = 0000 0522 2238 8861 1149 
inserted by FC2 system