PAT 1088

题目 : Rational Arithmetic

分值 : 20
难度 : 中等题
思路 : 辗转相除求最大公约数
坑点 : 很多判断条件,题目很烦,因此会有坑,例如你读进来的数也许就需要你进行约分才能输出

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
using namespace std;
long long a,b,A,B ;
bool INF = false ;
void print_result(long v1 , long v2)
{
if(v2 ==0 )
{
cout <<"Inf";
INF =true ;
return ;
}
bool flag = false ;
if(v1<0&&v2>0)
{
flag = true ;
v1 = -v1 ;
}
if(v1>0&&v2<0)
{
flag = true ;
v2 = -v2 ;
}
long long cur_b = v1 > v2 ? v2 : v1 ;
long long cur_a = v1 > v2 ? v1 : v2 ;
long long r =1 ,C ;
while(cur_b!=0)
{
C = cur_a / cur_b ;
r = cur_a % cur_b ;
cur_a = cur_b ;
cur_b = r ;
}
v1/= cur_a ;
v2/= cur_a ;
if(flag) cout <<"(-";
if(v1/v2)
cout<< v1/v2 ;
if(v1/v2 && v1%v2)
cout <<" ";
if(v1%v2)
cout<<v1%v2<<"/"<<v2;
if(!(v1/v2) && !(v1%v2))
cout << "0" ;
if(flag) cout<<")" ;
return ;
}
int main() {
scanf("%ld/%ld %ld/%ld" , &a ,& b ,&A ,&B );
// +
print_result(a,b);
cout<<" + ";
print_result(A,B);
cout<<" = ";
if(!INF)
print_result(B*a+A*b , B*b);
else cout <<"Inf" ;
cout <<endl ;

print_result(a,b);
cout<<" - ";
print_result(A,B);
cout<<" = ";
if(!INF)
print_result(B*a-A*b , B*b);
else cout <<"Inf" ;
cout <<endl ;

print_result(a,b);
cout<<" * ";
print_result(A,B);
cout<<" = ";
if(!INF)
print_result(A*a , B*b);
else cout <<"Inf" ;
cout <<endl ;

print_result(a,b);
cout<<" / ";
print_result(A,B);
cout<<" = ";
if(!INF)
print_result(B*a , A*b);
else cout <<"Inf" ;
cout <<endl ;
}