1034. 有理数四则运算(20)

题目描述

本题要求编写程序,计算2个有理数的和、差、积、商。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出格式:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

输入样例1:

2/3 -4/2

输出样例1:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例2:

5/3 0/6

输出样例2:

1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

提交代码

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <cstdio>

long int a1, b1;
long int a2, b2;

void print(long long int a, long long int b);
long long int gcd(long long int m, long long int n);
void add();
void sub();
void mul();
void div();

int main()
{
scanf("%ld/%ld %ld/%ld", &a1, &b1, &a2, &b2);
add();
sub();
mul();
div();

return 0;
}

void print(long long int a, long long int b)
{
bool flag, flag1, flag2;
long long int t, quotient;
if (a == 0) {
printf("0");
return;
}
if (b == 0) {
printf("Inf");
return;
}

if (a < 0) {
a = 0 - a;
flag1 = true;
} else {
flag1 = false;
}
if (b < 0) {
b = 0 - b;
flag2 = true;
} else {
flag2 = false;
}
flag = flag1 ^ flag2;

t = gcd(a, b);
a = a / t;
b = b / t;
quotient = a / b;
a = a % b;

if (flag) {
printf("(-");
}
if (quotient != 0) {
if (a == 0) {
printf("%lld", quotient);
} else {
printf("%lld %lld/%lld", quotient, a, b);
}
} else {
printf("%lld/%lld", a, b);
}
if (flag) {
printf(")");
}
}

long long int gcd(long long int m, long long int n)
{
long long int t = 1;
while (t) {
t = m % n;
m = n;
n = t;
}
return m;
}

void add()
{
long long int a, b;
a = a1 * b2 + a2 * b1;
b = b1 * b2;
print(a1, b1);
printf(" + ");
print(a2, b2);
printf(" = ");
print(a, b);
printf("\n");
}

void sub()
{
long long int a, b;
a = a1 * b2 - a2 * b1;
b = b1 * b2;
print(a1, b1);
printf(" - ");
print(a2, b2);
printf(" = ");
print(a, b);
printf("\n");
}

void mul()
{
long long int a, b;
a = a1 * a2;
b = b1 * b2;
print(a1, b1);
printf(" * ");
print(a2, b2);
printf(" = ");
print(a, b);
printf("\n");
}

void div()
{
long long int a, b;
a = a1 * b2;
b = b1 * a2;
print(a1, b1);
printf(" / ");
print(a2, b2);
printf(" = ");
print(a, b);
printf("\n");
}

个人思考

不难,但第三个测试点和题目给的范围有坑。题目里面说道,“其中分子和分母全是整形范围内的整数”。于是输入就直接用了整型,以防万一过程中的结果都用了 long long int。结果第三个测试点一直过不了,对照柳婼の代码前后反反复复提交了二十几遍,才终于发现是数据范围的问题,把输入改成 long intAC 了。