1: #include <stdio.h> 2: #include <mp.h> 3: m_in(a,b,f) MINT *a; FILE *f; 4: { MINT x,y,ten; 5: int sign,c; 6: short qten,qy; 7: xfree(a); 8: sign=1; 9: ten.len=1; 10: ten.val= &qten; 11: qten=b; 12: x.len=0; 13: y.len=1; 14: y.val= &qy; 15: while((c=getc(f))!=EOF) 16: switch(c) 17: { 18: case '\\': getc(f); 19: continue; 20: case '\t': 21: case '\n': a->len *= sign; 22: xfree(&x); 23: return(0); 24: case ' ': 25: continue; 26: case '-': sign = -sign; 27: continue; 28: default: if(c>='0' && c<= '9') 29: { qy=c-'0'; 30: mult(&x,&ten,a); 31: madd(a,&y,a); 32: move(a,&x); 33: continue; 34: } 35: else 36: { VOID ungetc(c,stdin); 37: a->len *= sign; 38: return(0); 39: } 40: } 41: return(EOF); 42: } 43: m_out(a,b,f) MINT *a; FILE *f; 44: { int sign,xlen,i; 45: short r; 46: MINT x; 47: char *obuf; 48: register char *bp; 49: sign=1; 50: xlen=a->len; 51: if(xlen<0) 52: { xlen= -xlen; 53: sign= -1; 54: } 55: if(xlen==0) 56: { fprintf(f,"0\n"); 57: return; 58: } 59: x.len=xlen; 60: x.val=xalloc(xlen,"m_out"); 61: for(i=0;i<xlen;i++) x.val[i]=a->val[i]; 62: obuf=(char *)malloc(7*xlen); 63: bp=obuf+7*xlen-1; 64: *bp--=0; 65: while(x.len>0) 66: { for(i=0;i<10&&x.len>0;i++) 67: { sdiv(&x,b,&x,&r); 68: *bp--=r+'0'; 69: } 70: if(x.len>0) *bp--=' '; 71: } 72: if(sign==-1) *bp--='-'; 73: fprintf(f,"%s\n",bp+1); 74: free(obuf); 75: FREE(x) 76: return; 77: } 78: sdiv(a,n,q,r) MINT *a,*q; short *r; 79: { MINT x,y; 80: int sign; 81: sign=1; 82: x.len=a->len; 83: x.val=a->val; 84: if(n<0) 85: { sign= -sign; 86: n= -n; 87: } 88: if(x.len<0) 89: { sign = -sign; 90: x.len= -x.len; 91: } 92: s_div(&x,n,&y,r); 93: xfree(q); 94: q->val=y.val; 95: q->len=sign*y.len; 96: *r = *r*sign; 97: return; 98: } 99: s_div(a,n,q,r) MINT *a,*q; short *r; 100: { int qlen,i; 101: long int x; 102: short *qval; 103: x=0; 104: qlen=a->len; 105: qval=xalloc(qlen,"s_div"); 106: for(i=qlen-1;i>=0;i--) 107: { 108: x=x*0100000L+a->val[i]; 109: qval[i]=x/n; 110: x=x%n; 111: } 112: *r=x; 113: if(qval[qlen-1]==0) qlen--; 114: q->len=qlen; 115: q->val=qval; 116: if(qlen==0) shfree(qval); 117: return; 118: } 119: min(a) MINT *a; 120: { 121: return(m_in(a,10,stdin)); 122: } 123: omin(a) MINT *a; 124: { 125: return(m_in(a,8,stdin)); 126: } 127: mout(a) MINT *a; 128: { 129: m_out(a,10,stdout); 130: } 131: omout(a) MINT *a; 132: { 133: m_out(a,8,stdout); 134: } 135: fmout(a,f) MINT *a; FILE *f; 136: { m_out(a,10,f); 137: } 138: fmin(a,f) MINT *a; FILE *f; 139: { 140: return(m_in(a,10,f)); 141: }