总时间限制: 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" 的形式表示。
样例输入
样例输出
思路
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:两个分数相加
输入
输出
样例 2:判定分子分母相等
输入
输出
样例 3:分母为 1,分子不为 1
输入
输出
样例 4:求出最简形式
输入
输出
样例 5:多个分数相加
输入
输出