PAT1081:Rational Sum
Posted 0kk470
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT1081:Rational Sum相关的知识,希望对你有一定的参考价值。
1081. Rational Sum (20)
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/3Sample Output 1:
3 1/3Sample Input 2:
2 4/3 2/3Sample Output 2:
2Sample Input 3:
3 1/3 -1/6 1/8Sample Output 3:
7/24
思路
分子相加的运算。
1.辗转相除法求分子分母的最大公约数
2.两分数相加后要化简,不然容易在计算时产生溢出。
3.输出需要特别注意的格式:
1)在整数不为0的情况下,分数为0则只输出整数。
2)在整数为0的情况下,分数不为0则只输出分数。
3)二者都为0直接输出一个0。
4)二者都不为0按题目要求的标准格式输出。
4.关于分母为0的情况,题目测试用例好像并未考虑,暂不做处理。
代码
#include<iostream> using namespace std; typedef long long ll; ll gcd(ll a,ll b) //求最大公约数 { return b == 0?abs(a):gcd(b,a % b); } int main() { ll N,a,b,gvalue,suma,sumb; while( cin >> N) { suma = 0,sumb = 1; for(int i = 0;i < N;i++) { scanf("%lld/%lld",&a,&b); gvalue = gcd(a,b); //约分 a /= gvalue; b /= gvalue; //分数求公倍数相加 suma = a * sumb + b * suma; sumb = b * sumb; //分子和约分 gvalue = gcd(suma,sumb); suma /= gvalue; sumb /= gvalue; } ll integer = suma / sumb; ll numerator = suma - integer * sumb; if(integer != 0) { cout << integer; if(numerator != 0) { cout << " "; printf("%lld/%lld",numerator,sumb); } } else { if(numerator != 0) { printf("%lld/%lld",numerator,sumb); } else cout << 0; } cout << endl; } }
以上是关于PAT1081:Rational Sum的主要内容,如果未能解决你的问题,请参考以下文章
[PAT] 1081 Rational Sum (20 分)Java
PAT 甲级 1081 Rational Sum (数据不严谨 点名批评)