PAT (Advanced Level) Practise 1081 Rational Sum(20)
2017-07-05 20:07
525 查看
1081. Rational Sum (20)
时间限制400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum.
Input Specification:
Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers "a1/b1 a2/b2 ..." where all the numerators and denominators are in the range of "long int". If there is a negative number,
then the sign must appear in front of the numerator.
Output Specification:
For each test case, output the sum in the simplest form "integer numerator/denominator" where "integer" is the integer part of the sum, "numerator" < "denominator", and the numerator and the denominator have no common factor. You must output only the fractional
part if the integer part is 0.
Sample Input 1:
5 2/5 4/15 1/30 -2/60 8/3
Sample Output 1:
3 1/3
Sample Input 2:
2 4/3 2/3
Sample Output 2:
2
Sample Input 3:
3 1/3 -1/6 1/8
Sample Output 3:
7/24
题意:给你n个分数,求出它们的和
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <bitset> #include <functional> using namespace std; #define LL long long const int INF = 0x3f3f3f3f; LL a[105], b[105]; int n; LL gcd(LL x, LL y) { if (x > y) swap(x, y); while (y%x) { LL k = y%x; y = x; x = k; } return x; } int main() { while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) scanf("%lld/%lld", &a[i], &b[i]); LL ans1=0,ans2=1; for (int i = 1; i <= n; i++) { LL k = gcd(ans2, b[i]); ans2 = b[i] * ans2 / k; } for (int i = 1; i <= n; i++) ans1 += ans2 / b[i] * a[i]; if (!ans1) { printf("0\n"); continue; } LL x = abs(ans1); LL k = gcd(x, ans2); ans1 /= k, ans2 /= k; if (ans1%ans2 == 0) printf("%lld\n", ans1 / ans2); else { if (abs(ans1) < ans2) printf("%lld/%lld\n", ans1, ans2); else { if (ans1 > 0) printf("%lld %lld/%lld\n", ans1 / ans2, ans1%ans2, ans2); else printf("%lld -%lld/%lld\n",(LL)(ans1 / ans2), abs(ans1)%ans2, ans2); } } } return 0; }
相关文章推荐
- PAT (Advanced Level) Practise 1081 Rational Sum (20)
- PAT (Advanced Level) 1081. Rational Sum (20) 分数求和,辗转相除法求gcd
- 【PAT】【Advanced Level】1081. Rational Sum (20)
- PAT Advanced Level 1081. Rational Sum (20)
- PAT (Advanced Level) 1081. Rational Sum (20)
- PAT-Advanced-Level-Practise-1084. Broken Keyboard (20)
- PAT (Advanced Level) Practise 1108 Finding Average (20)
- PAT (Advanced Level) Practise 1023 Have Fun with Numbers (20)
- 1015. Reversible Primes (20) ——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1088 Rational Arithmetic (20)
- PAT (Advanced Level) Practise 1061 Dating (20)
- PAT (Advanced Level) Practise 1050 String Subtraction (20)
- PAT (Advanced Level) Practise 1088 Rational Arithmetic (20)
- PAT-PAT (Advanced Level) Practise 1031. Hello World for U (20) (图形打印) 【二星级】
- 1092. To Buy or Not to Buy (20)【水题】——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1015. Reversible Primes (20) 素数筛法 进制转换
- PAT-PAT (Advanced Level) Practise String Subtraction (20)【一星级】
- 1046. Shortest Distance (20)【贪心】——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1031 Hello World for U (20)
- PAT (Advanced Level) Practise - 1008. Elevator (20)