Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum.
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.
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.
5
2/5 4/15 1/30 -2/60 8/3
3 1/3
2
4/3 2/3
2
3
1/3 -1/6 1/8
7/24
输入n个分数,输出这些分数的和.
(1)因为分子分母加运算涉及乘操作,所以设定分子分母数据类型为long long;
(2)设计分数加运算函数add()和分数化简函数reduction(),每次分数进行了加运算后要化简,否则测试点会超时,最后设计函数show()输出分数,具体实现见代码.
#include <cstdio>#include <algorithm>using namespace std;typedef long long LL;struct Fraction{//分子、分母 LL up,down;};Fraction add(Fraction a,Fraction b){//分数加运算 Fraction c; c.up = a.up*b.down a.down*b.up; c.down = a.down*b.down; return c;}LL gcd(LL a,LL b){//递归求公约数 return !b ? a:gcd(b,a%b);} Fraction reduction(Fraction a){//分数化简 if(a.down<0){//如果分母小于0则分子分母取相反数 a.up = -a.up; a.down = -a.down; } if(a.up==0) a.down = 1;//如果分子为0则令分母为1 else{//如果分子不为0则化简分数 int b = gcd(abs(a.up),abs(a.down));//取分子分母绝对值求最大公约数 a.up = a.up/b; a.down = a.down/b; } return a;}void show(Fraction a){//输出分数 if(a.down==1) printf("%lld\n",a.up);//如果分母为1则分子部分作为整数输出 else if(a.up>a.down) printf("%lld %lld/%lld\n",a.up/a.down,abs(a.up)%a.down,a.down);//如果分数为假分数则按带分数形式输出 else printf("%lld/%lld\n",a.up,a.down);//如果分数为真分数则直接输出}int main(){ int n; scanf("%d",&n); Fraction A[n],result; result.up = 0,result.down = 1;//分子初始化为0,分母初始化为1 for(int i=0;i<n;i ){ scanf("%lld/%lld",&A[i].up,&A[i].down); result = add(result,A[i]); result = reduction(result);//每一次加法运算完都要化简,否则超时 } show(result); return 0;}
rational number 有理数
numerator 分子
denominator 分母
联系客服