抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

总时间限制: 1000ms 内存限制: 65536kB

描述

输入 n 个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为 1;若最终结果的分母为 1,则直接用整数表示。

如:5/6、10/3 均是最简形式,而 3/6 需要化简为 1/2, 3/1 需要化简为 3。

分子和分母均不为 0,也不为负数。

输入

第一行是一个整数 n,表示分数个数,1 <= n <= 10;
接下来 n 行,每行一个分数,用 "p/q" 的形式表示,不含空格,p,q 均不超过 10。

输出

输出只有一行,即最终结果的最简形式。若为分数,用 "p/q" 的形式表示。

样例输入

1
2
3
2
1/2
1/3

样例输出

1
5/6

思路

Code

C++ STL

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
#include <bits/stdc++.h>
using namespace std;

int main() {
int n, c;
pair<int, int> num, res(0, 0);
string a;
cin >> n;
for(int i = 1; i <= n; i++) {
getline(cin, a, '/');
num.first = atoi(a.c_str());
getline(cin, a);
num.second = atoi(a.c_str());
if(res.first == 0 && res.second == 0) {
res.first = num.first;
res.second = num.second;
} else {
res.first *= num.second;
c = res.second;
res.second *= num.second;
num.first *= c;
num.second *= c;
res.first += num.first;
if(res.first > res.second) {
if(res.first % res.second == 0) {
c = res.second;
res.first /= c;
res.second /= c;
}
} else if(res.first == res.second) {
res.first = 1;
res.second = 1;
} else if(res.first < res.second) {
if(res.second % res.first == 0) {
c = res.first;
res.first /= c;
res.second /= c;
}
}
}
}
int flag = 1;
while(flag) {
for(int i = 2; i < 10; i++) {
if(res.first % i == 0 && res.second % i == 0) {
flag = 1;
res.first /= i;
res.second /= i;
goto out;
}
}
flag = 0;
out:;
}
if(res.first != res.second && res.second != 1) cout << res.first << "/" << res.second;
else if(res.second == 1) cout << res.first;
}

C

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
#include <stdio.h>
#include <stdlib.h>

int main() {
int n, c;
int num[2], res[2] = {0, 0};
char a[10];
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d/%d", &num[0], &num[1]);
if(res[0] == 0 && res[1] == 0) {
res[0] = num[0];
res[1] = num[1];
} else {
res[0] *= num[1];
c = res[1];
res[1] *= num[1];
num[0] *= c;
num[1] *= c;
res[0] += num[0];
if(res[0] > res[1]) {
if(res[0] % res[1] == 0) {
c = res[1];
res[0] /= c;
res[1] /= c;
}
} else if(res[0] == res[1]) {
res[0] = 1;
res[1] = 1;
} else if(res[0] < res[1]) {
if(res[1] % res[0] == 0) {
c = res[0];
res[0] /= c;
res[1] /= c;
}
}
}
}
int flag = 1;
while(flag) {
for(int i = 2; i < 10; i++) {
if(res[0] % i == 0 && res[1] % i == 0) {
flag = 1;
res[0] /= i;
res[1] /= i;
goto out;
}
}
flag = 0;
out:;
}
if(res[0] != res[1] && res[1] != 1) printf("%d/%d", res[0], res[1]);
else if(res[1] == 1) printf("%d", res[0]);
}

测试用例

样例 1:两个分数相加

输入

1
2
3
2
1/2
1/3

输出

1
5/6

样例 2:判定分子分母相等

输入

1
2
3
2
1/2
1/2

输出

1
1

样例 3:分母为 1,分子不为 1

输入

1
2
3
2
1/1
2/1

输出

1
3

样例 4:求出最简形式

输入

1
2
3
2
5/3
5/3

输出

1
10/3

样例 5:多个分数相加

输入

1
2
3
4
3
1/2
1/2
1/2

输出

1
3/2