1 /* 优点:
2 1 支持负整数的运算
3 2 良好的输出形式 没有前导零
4 3 支持cin直接输入 支持cout直接输出
5 4 支持整数的直接赋值 big_int x=100;
6 缺点:
7 1 封装不好 基本都是友元函数操作
8 2 速度慢 乘法没有使用FFT 除法采用二分法
9 使用STL string储存数据也造成速度不是很快
10 3 待解决的问题 不能直接输出 cout<<a-b
11 */
12
13 #include <iostream>
14 #include <algorithm>
15 #include <stack>
16 using namespace std;
17 void change (string &s) {
18 string tmp="";
19 int i;
20 for (i=0;i<s.size();i++)
21 if (s[i]!='0')
22 break;
23 if (i==s.size()) s="0";
24 else {
25 for (;i<s.size();i++)
26 tmp+=s[i];
27 s=tmp;
28 }
29 }
30 class big_int
31 {
32 private :
33 bool flag;
34 string s;
35 public :
36 big_int (){ flag=1; s="0"; }
37 big_int (int x);
38 bool operator ==(const big_int& x) {
39 string tmp=x.s;
40 change (s);
41 change (tmp);
42 if (x.s=="0"&&s=="0") return true;
43 return x.flag==flag&&s==tmp;
44 }
45 friend big_int operator+(const big_int& a, const big_int& b );
46 friend big_int operator-(const big_int& a, const big_int& b );
47 friend big_int operator*(const big_int& a, const big_int& b);
48 friend big_int operator/(const big_int& a, const big_int& b);
49 friend big_int operator%(const big_int& a, const big_int& b);
50 friend ostream& operator<<(ostream& out,big_int& x) {
51 if (!x.flag&&x.s!="0") cout<<"-";
52 change (x.s);
53 cout<<x.s;
54 return out;
55 }
56 friend istream& operator>>(istream& in,big_int& x) {
57 string tmp;
58 cin>>tmp;
59 if (tmp[0]=='-') {
60 x.flag=0;
61 x.s=tmp.substr(1,tmp.size()-1);
62 }
63 else {
64 x.flag=1;
65 x.s=tmp;
66 }
67 return in;
68 }
69 };
70 big_int:: big_int (int x) {
71 if (x<0) flag=0;
72 else flag=1;
73 x=abs(x);
74
75 s=""; string tmp="0";
76 if (x==0) s+=tmp;
77 while (x!=0) {
78 tmp[0]='0'+x%10;
79 s+=tmp;
80 x/=10;
81 }
82 reverse(s.begin(),s.end());
83 }
84 string add(string s1,string s2) {
85 reverse(s1.begin(),s1.end());
86 reverse(s2.begin(),s2.end());
87 int len =max (s1.size(),s2.size());
88 int k=0; int t1,t2;
89 string ans=""; string tmp="0";
90 for (int i=0;i<len;i++) {
91 t1=t2=0;
92 if (i<s1.size()) t1=s1[i]-'0';
93 if (i<s2.size()) t2=s2[i]-'0';
94 int t=t1+t2+k;
95 tmp[0]='0'+t%10; k=t/10;
96 ans+=tmp;
97 }
98 if (k!=0) {
99 tmp[0]='0'+k;
100 ans+=tmp;
101 }
102 reverse(ans.begin(),ans.end());
103 return ans;
104 }
105 string sub (string s1,string s2) {
106 reverse(s1.begin(),s1.end());
107 reverse(s2.begin(),s2.end());
108 int len =s1.size();
109 int t1,t2;
110 string ans=""; string tmp="0";
111 for (int i=0;i<len;i++) {
112 t1=s1[i]-'0'; t2=0;
113 if (i<s2.size()) t2=s2[i]-'0';
114 if (t1<t2) {
115 for (int j=i+1;j<len;j++)
116 if (s1[j]-'0'==0) s1[j]='9';
117 else {
118 s1[j]--;
119 break;
120 }
121 t1+=10;
122 }
123 tmp[0]=t1-t2+'0';
124 ans+=tmp;
125 }
126 reverse(ans.begin(),ans.end());
127 change(ans);
128 return ans;
129 }
130 bool m_cmp (string s1, string s2) {
131 change (s1);
132 change (s2);
133 if (s1.size()==s2.size()) {
134 for (int i=0;i<s1.size();i++)
135 if (s1[i]!=s2[i])
136 return s1[i]>s2[i];
137 }
138 return s1.size()>s2.size();
139 }
140 string s_mul (string s,int x,int k) {
141 string ans=""; string tmp="0";
142 for (int i=1;i<=k;i++) ans+=tmp;
143 k=0;
144 for (int i=0;i<s.size();i++) {
145 int t=s[i]-'0';
146 int p=t*x+k;
147 tmp[0]='0'+p%10; ans+=tmp;
148 k=p/10;
149 }
150 if (k) {
151 tmp[0]='0'+k;
152 ans+=tmp;
153 }
154 reverse(ans.begin(),ans.end());
155 change(ans);
156 return ans;
157 }
158 string mul (string s1,string s2) {
159 reverse(s1.begin(),s1.end());
160 reverse(s2.begin(),s2.end());
161 string ans="0";
162 for (int i=0;i<s2.size();i++) {
163 int x=s2[i]-'0';
164 string tmp=s_mul (s1,x,i);
165 ans=add(ans,tmp);
166 //cout<<ans<<endl;
167 }
168 return ans;
169 }
170 big_int operator+(const big_int& a, const big_int& b ) {
171 big_int c;
172 int t=a.flag^b.flag;
173 if (t==0) {
174 c.s=add (a.s,b.s);
175 c.flag=a.flag;
176 }
177 else {
178 if (m_cmp(a.s,b.s)) {
179 c.flag=a.flag;
180 c.s=sub (a.s,b.s);
181 }
182 else {
183 c.flag=b.flag;
184 c.s=sub (b.s,a.s);
185 }
186 }
187 return c;
188 }
189 big_int operator-(const big_int& a, const big_int& b ) {
190 big_int c=b;
191 c.flag=!b.flag;
192 return a+c;
193 }
194 big_int operator*(const big_int& a, const big_int& b) {
195 big_int c;
196 int t=a.flag^b.flag;
197 if (t) c.flag=0;
198 if (m_cmp(a.s,b.s)) c.s=mul (a.s,b.s);
199 else c.s=mul (b.s,a.s);
200 return c;
201 }
202 big_int operator/(const big_int& a, const big_int& b) {
203 if (b.s=="0") {
204 cout<<"error"<<endl;
205 exit(-1);
206 }
207 big_int c;
208 big_int _a=a, _b=b;
209 _a.flag=_b.flag=1;
210 if (m_cmp(_b.s,_a.s)) return c;
211
212 stack <big_int> q;
213 big_int k=1;
214 while (1) {
215 big_int x=k*_b; q.push(k);
216 if (m_cmp(x.s,_a.s))
217 break;
218 k=k*2;
219 }
220 big_int tmp=_a;
221 while (tmp.s!="0"&&!q.empty()) {
222 k=q.top(); q.pop();
223 big_int x=k*_b;
224 if ( !m_cmp(x.s,tmp.s)) {
225 tmp=tmp-x;
226 c=c+k;
227 }
228 }
229 if (a.flag^b.flag) c.flag=0;
230 return c;
231 }
232 big_int operator%(const big_int& a, const big_int& b) {
233 big_int c=a/b;
234 c=c*b;
235 c=a-c;
236 return c;
237 }
238 int main ()
239 {
240 big_int a,b;
241 big_int c=-100;
242 cout<<c<<endl;
243 while (cin>>a>>b) {
244 c=a+12;
245 cout<<c<<" ";
246 c=a-b;
247 cout<<c<<" ";
248 c=a*b;
249 cout<<c<<" ";
250 c=a/b;
251 cout<<c<<" ";
252 c=a%b;
253 cout<<c<<endl;
254 }
255 return 0;
256 }