【PAT甲级】1088 Rational Arithmetic (20 分)

题意:

输入两个分数(分子分母各为一个整数中间用'/'分隔),输出它们的四则运算表达式。小数需要用"("和")"括起来,分母为0的话输出"Inf"(输入的分母保证不为0)。

trick:

测试点2很容易溢出,建议遇到乘法时先化简分数并且不要用相乘小于零来判断异号。

AAAAAccepted code:

  1 #define HAVE_STRUCT_TIMESPEC
  2 #include<bits/stdc++.h>
  3 using namespace std;
  4 int main(){
  5     ios::sync_with_stdio(false);
  6     cin.tie(NULL);
  7     cout.tie(NULL);
  8     long long a,b,c,d;
  9     cin>>a;
 10     cin.ignore();
 11     cin>>b>>c;
 12     cin.ignore();
 13     cin>>d;
 14     long long x=1e9,y=1e9;
 15     if(a%b==0)
 16         x=a/b;
 17     if(c%d==0)
 18         y=c/d;
 19     long long gcd=__gcd(a,b);
 20     a/=gcd;
 21     b/=gcd;
 22     gcd=__gcd(c,d);
 23     c/=gcd;
 24     d/=gcd;
 25     if(x<1e9){
 26         if(x<0)
 27             cout<<"("<<x<<")";
 28         else
 29             cout<<x;
 30     }
 31     else{
 32         long long ta=a,tb=b;
 33         if(ta<0&&tb>0||ta>0&&tb<0){
 34             if(ta<0)
 35                 ta=-ta;
 36             if(tb<0)
 37                 tb=-tb;
 38             long long yushu=0;
 39             if(ta>tb){
 40                 yushu=ta/tb;
 41                 ta-=yushu*tb;
 42             }
 43             cout<<"(-";
 44             if(yushu)
 45                 cout<<yushu<<" ";
 46             cout<<ta<<"/"<<tb<<")";
 47         }
 48         else{
 49             long long yushu=0;
 50             if(ta>tb){
 51                 yushu=ta/tb;
 52                 ta-=yushu*tb;
 53             }
 54             if(yushu)
 55                 cout<<yushu<<" ";
 56             cout<<ta<<"/"<<tb;
 57         }
 58     }
 59     cout<<" + ";
 60     if(y<1e9){
 61         if(y<0)
 62             cout<<"("<<y<<")";
 63         else
 64             cout<<y;
 65     }
 66     else{
 67         long long ta=c,tb=d;
 68         if(ta<0&&tb>0||ta>0&&tb<0){
 69             if(ta<0)
 70                 ta=-ta;
 71             if(tb<0)
 72                 tb=-tb;
 73             long long yushu=0;
 74             if(ta>tb){
 75                 yushu=ta/tb;
 76                 ta-=yushu*tb;
 77             }
 78             cout<<"(-";
 79             if(yushu)
 80                 cout<<yushu<<" ";
 81             cout<<ta<<"/"<<tb<<")";
 82         }
 83         else{
 84             long long yushu=0;
 85             if(ta>tb){
 86                 yushu=ta/tb;
 87                 ta-=yushu*tb;
 88             }
 89             if(yushu)
 90                 cout<<yushu<<" ";
 91             cout<<ta<<"/"<<tb;
 92         }
 93     }
 94     cout<<" = ";
 95     long long cd=b*d;
 96     long long ab=a*d+c*b;
 97     if(ab%cd==0){
 98         long long z=ab/cd;
 99         if(z<0)
100             cout<<"("<<z<<")";
101         else
102             cout<<z;
103     }
104     else if(ab<0&&cd>0||ab>0&&cd<0){
105         if(ab<0)
106             ab=-ab;
107         if(cd<0)
108             cd=-cd;
109         long long yushu=0;
110         if(ab>cd){
111             yushu=ab/cd;
112             ab-=yushu*cd;
113         }
114         long long gcd=__gcd(ab,cd);
115         ab/=gcd;
116         cd/=gcd;
117         cout<<"(-";
118         if(yushu)
119             cout<<yushu<<" ";
120         cout<<ab<<"/"<<cd<<")";
121     }
122     else{
123         long long yushu=0;
124         if(ab>cd){
125             yushu=ab/cd;
126             ab-=yushu*cd;
127         }
128         long long gcd=__gcd(ab,cd);
129         ab/=gcd;
130         cd/=gcd;
131         if(yushu)
132             cout<<yushu<<" ";
133         cout<<ab<<"/"<<cd;
134     }
135     cout<<"
";
136     //加减法分割线-------------
137     if(x<1e9){
138         if(x<0)
139             cout<<"("<<x<<")";
140         else
141             cout<<x;
142     }
143     else{
144         long long ta=a,tb=b;
145         if(ta<0&&tb>0||ta>0&&tb<0){
146             if(ta<0)
147                 ta=-ta;
148             if(tb<0)
149                 tb=-tb;
150             long long yushu=0;
151             if(ta>tb){
152                 yushu=ta/tb;
153                 ta-=yushu*tb;
154             }
155             cout<<"(-";
156             if(yushu)
157                 cout<<yushu<<" ";
158             cout<<ta<<"/"<<tb<<")";
159         }
160         else{
161             long long yushu=0;
162             if(ta>tb){
163                 yushu=ta/tb;
164                 ta-=yushu*tb;
165             }
166             if(yushu)
167                 cout<<yushu<<" ";
168             cout<<ta<<"/"<<tb;
169         }
170     }
171     cout<<" - ";
172     if(y<1e9){
173         if(y<0)
174             cout<<"("<<y<<")";
175         else
176             cout<<y;
177     }
178     else{
179         long long ta=c,tb=d;
180         if(ta<0&&tb>0||ta>0&&tb<0){
181             if(ta<0)
182                 ta=-ta;
183             if(tb<0)
184                 tb=-tb;
185             long long yushu=0;
186             if(ta>tb){
187                 yushu=ta/tb;
188                 ta-=yushu*tb;
189             }
190             cout<<"(-";
191             if(yushu)
192                 cout<<yushu<<" ";
193             cout<<ta<<"/"<<tb<<")";
194         }
195         else{
196             long long yushu=0;
197             if(ta>tb){
198                 yushu=ta/tb;
199                 ta-=yushu*tb;
200             }
201             if(yushu)
202                 cout<<yushu<<" ";
203             cout<<ta<<"/"<<tb;
204         }
205     }
206     cout<<" = ";
207     cd=b*d;
208     ab=a*d-c*b;
209     if(ab%cd==0){
210         long long z=ab/cd;
211         if(z<0)
212             cout<<"("<<z<<")";
213         else
214             cout<<z;
215     }
216     else if(ab<0&&cd>0||ab>0&&cd<0){
217         if(ab<0)
218             ab=-ab;
219         if(cd<0)
220             cd=-cd;
221         long long yushu=0;
222         if(ab>cd){
223             yushu=ab/cd;
224             ab-=yushu*cd;
225         }
226         long long gcd=__gcd(ab,cd);
227         ab/=gcd;
228         cd/=gcd;
229         cout<<"(-";
230         if(yushu)
231             cout<<yushu<<" ";
232         cout<<ab<<"/"<<cd<<")";
233     }
234     else{
235         long long yushu=0;
236         if(ab>cd){
237             yushu=ab/cd;
238             ab-=yushu*cd;
239         }
240         long long gcd=__gcd(ab,cd);
241         ab/=gcd;
242         cd/=gcd;
243         if(yushu)
244             cout<<yushu<<" ";
245         cout<<ab<<"/"<<cd;
246     }
247     cout<<"
";
248     //减法和乘除法分隔线-------------
249     if(x<1e9){
250         if(x<0)
251             cout<<"("<<x<<")";
252         else
253             cout<<x;
254     }
255     else{
256         long long ta=a,tb=b;
257         if(ta<0&&tb>0||ta>0&&tb<0){
258             if(ta<0)
259                 ta=-ta;
260             if(tb<0)
261                 tb=-tb;
262             long long yushu=0;
263             if(ta>tb){
264                 yushu=ta/tb;
265                 ta-=yushu*tb;
266             }
267             cout<<"(-";
268             if(yushu)
269                 cout<<yushu<<" ";
270             cout<<ta<<"/"<<tb<<")";
271         }
272         else{
273             long long yushu=0;
274             if(ta>tb){
275                 yushu=ta/tb;
276                 ta-=yushu*tb;
277             }
278             if(yushu)
279                 cout<<yushu<<" ";
280             cout<<ta<<"/"<<tb;
281         }
282     }
283     cout<<" * ";
284     if(y<1e9){
285         if(y<0)
286             cout<<"("<<y<<")";
287         else
288             cout<<y;
289     }
290     else{
291         long long ta=c,tb=d;
292         if(ta<0&&tb>0||ta>0&&tb<0){
293             if(ta<0)
294                 ta=-ta;
295             if(tb<0)
296                 tb=-tb;
297             long long yushu=0;
298             if(ta>tb){
299                 yushu=ta/tb;
300                 ta-=yushu*tb;
301             }
302             cout<<"(-";
303             if(yushu)
304                 cout<<yushu<<" ";
305             cout<<ta<<"/"<<tb<<")";
306         }
307         else{
308             long long yushu=0;
309             if(ta>tb){
310                 yushu=ta/tb;
311                 ta-=yushu*tb;
312             }
313             if(yushu)
314                 cout<<yushu<<" ";
315             cout<<ta<<"/"<<tb;
316         }
317     }
318     cout<<" = ";
319     cd=b*d;
320     ab=a*c;
321     if(ab%cd==0){
322         long long z=ab/cd;
323         if(z<0)
324             cout<<"("<<z<<")";
325         else
326             cout<<z;
327     }
328     else if(ab<0&&cd>0||ab>0&&cd<0){
329         if(ab<0)
330             ab=-ab;
331         if(cd<0)
332             cd=-cd;
333         long long yushu=0;
334         if(ab>cd){
335             yushu=ab/cd;
336             ab-=yushu*cd;
337         }
338         long long gcd=__gcd(ab,cd);
339         ab/=gcd;
340         cd/=gcd;
341         cout<<"(-";
342         if(yushu)
343             cout<<yushu<<" ";
344         cout<<ab<<"/"<<cd<<")";
345     }
346     else{
347         long long yushu=0;
348         if(ab>cd){
349             yushu=ab/cd;
350             ab-=yushu*cd;
351         }
352         long long gcd=__gcd(ab,cd);
353         ab/=gcd;
354         cd/=gcd;
355         if(yushu)
356             cout<<yushu<<" ";
357         cout<<ab<<"/"<<cd;
358     }
359     cout<<"
";
360     //乘除法分隔线-------------
361     if(x<1e9){
362         if(x<0)
363             cout<<"("<<x<<")";
364         else
365             cout<<x;
366     }
367     else{
368         long long ta=a,tb=b;
369         if(ta<0&&tb>0||ta>0&&tb<0){
370             if(ta<0)
371                 ta=-ta;
372             if(tb<0)
373                 tb=-tb;
374             long long yushu=0;
375             if(ta>tb){
376                 yushu=ta/tb;
377                 ta-=yushu*tb;
378             }
379             cout<<"(-";
380             if(yushu)
381                 cout<<yushu<<" ";
382             cout<<ta<<"/"<<tb<<")";
383         }
384         else{
385             long long yushu=0;
386             if(ta>tb){
387                 yushu=ta/tb;
388                 ta-=yushu*tb;
389             }
390             if(yushu)
391                 cout<<yushu<<" ";
392             cout<<ta<<"/"<<tb;
393         }
394     }
395     cout<<" / ";
396     if(y<1e9){
397         if(y<0)
398             cout<<"("<<y<<")";
399         else
400             cout<<y;
401     }
402     else{
403         long long ta=c,tb=d;
404         if(ta<0&&tb>0||ta>0&&tb<0){
405             if(ta<0)
406                 ta=-ta;
407             if(tb<0)
408                 tb=-tb;
409             long long yushu=0;
410             if(ta>tb){
411                 yushu=ta/tb;
412                 ta-=yushu*tb;
413             }
414             cout<<"(-";
415             if(yushu)
416                 cout<<yushu<<" ";
417             cout<<ta<<"/"<<tb<<")";
418         }
419         else{
420             long long yushu=0;
421             if(ta>tb){
422                 yushu=ta/tb;
423                 ta-=yushu*tb;
424             }
425             if(yushu)
426                 cout<<yushu<<" ";
427             cout<<ta<<"/"<<tb;
428         }
429     }
430     cout<<" = ";
431     cd=b*c;
432     ab=a*d;
433     if(cd==0){
434         cout<<"Inf";
435         return 0;
436     }
437     if(ab%cd==0){
438         long long z=ab/cd;
439         if(z<0)
440             cout<<"("<<z<<")";
441         else
442             cout<<z;
443     }
444     else if(ab<0&&cd>0||ab>0&&cd<0){
445         if(ab<0)
446             ab=-ab;
447         if(cd<0)
448             cd=-cd;
449         long long yushu=0;
450         if(ab>cd){
451             yushu=ab/cd;
452             ab-=yushu*cd;
453         }
454         long long gcd=__gcd(ab,cd);
455         ab/=gcd;
456         cd/=gcd;
457         cout<<"(-";
458         if(yushu)
459             cout<<yushu<<" ";
460         cout<<ab<<"/"<<cd<<")";
461     }
462     else{
463         long long yushu=0;
464         if(ab>cd){
465             yushu=ab/cd;
466             ab-=yushu*cd;
467         }
468         long long gcd=__gcd(ab,cd);
469         ab/=gcd;
470         cd/=gcd;
471         if(yushu)
472             cout<<yushu<<" ";
473         cout<<ab<<"/"<<cd;
474     }
475     return 0;
476 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11890333.html