|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.