PAT A1081 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/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个分数,输出这些分数的和.

思路:

(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 分母

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值