|
|
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':
22: goto done;
23: case ' ':
24: continue;
25: case '-': sign = -sign;
26: continue;
27: default: if(c>='0' && c<= '9')
28: { qy=c-'0';
29: mult(&x,&ten,a);
30: madd(a,&y,a);
31: move(a,&x);
32: continue;
33: }
34: else
35: { (void) ungetc(c,stdin);
36: done:
37: a->len *= sign;
38: mcan(a);
39: return(0);
40: }
41: }
42: return(EOF);
43: }
44: m_out(a,b,f) mint *a; FILE *f;
45: { int sign,xlen,i;
46: short r;
47: mint x;
48: char *obuf;
49: register char *bp;
50: sign=1;
51: xlen=a->len;
52: if(xlen<0)
53: { xlen= -xlen;
54: sign= -1;
55: }
56: if(xlen==0)
57: { fprintf(f,"0\n");
58: return;
59: }
60: x.len=xlen;
61: x.val=xalloc(xlen,"m_out");
62: for(i=0;i<xlen;i++) x.val[i]=a->val[i];
63: obuf=(char *)malloc(7*xlen);
64: bp=obuf+7*xlen-1;
65: *bp--=0;
66: while(x.len>0)
67: { for(i=0;i<10&&x.len>0;i++)
68: { sdiv(&x,b,&x,&r);
69: *bp--=r+'0';
70: }
71: if(x.len>0) *bp--=' ';
72: }
73: if(sign==-1) *bp--='-';
74: fprintf(f,"%s\n",bp+1);
75: free(obuf);
76: xfree(&x);
77: return;
78: }
79: sdiv(a,n,q,r) mint *a,*q; short *r;
80: { mint x,y;
81: int sign;
82: sign=1;
83: x.len=a->len;
84: x.val=a->val;
85: if(n<0) {
86: sign= -sign;
87: n= -n;
88: }
89: if(x.len<0) {
90: sign = -sign;
91: x.len= -x.len;
92: }
93: else if(x.len == 0) {
94: xfree(q);
95: *r = 0;
96: return;
97: }
98: s_div(&x,n,&y,r);
99: xfree(q);
100: q->val=y.val;
101: q->len=sign*y.len;
102: *r = *r*sign;
103: return;
104: }
105: s_div(a,n,q,r) mint *a,*q; short *r;
106: { int qlen,i;
107: long int x;
108: short *qval;
109: x=0;
110: qlen=a->len;
111: qval=xalloc(qlen,"s_div");
112: for(i=qlen-1;i>=0;i--)
113: {
114: x=x*0100000L+a->val[i];
115: qval[i]=x/n;
116: x=x%n;
117: }
118: *r=x;
119: if(qval[qlen-1]==0) qlen--;
120: q->len=qlen;
121: q->val=qval;
122: if(qlen==0) shfree(qval);
123: return;
124: }
125: min(a) mint *a;
126: {
127: return(m_in(a,10,stdin));
128: }
129: omin(a) mint *a;
130: {
131: return(m_in(a,8,stdin));
132: }
133: mout(a) mint *a;
134: {
135: m_out(a,10,stdout);
136: }
137: omout(a) mint *a;
138: {
139: m_out(a,8,stdout);
140: }
141: fmout(a,f) mint *a; FILE *f;
142: { m_out(a,10,f);
143: }
144: fmin(a,f) mint *a; FILE *f;
145: {
146: return(m_in(a,10,f));
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.