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