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.定义分数的结构体,再写一个化简函数,对分子分母约分 ,注意约分时,应对分子分母的绝对值进行求最大公约数的操作。

2.在求和时,每次求和之后都要化简,否则会溢出,虽然给出的分子不会超过int类型,但答案可能会超过int型,因此必须使用long long类型定义。

3.写一个输出函数,分真分数,假分数,整数,以及0这四种情况输出。

参考代码:

#include<cstdio>
using namespace std;
long long gcd(long long a,long long b){
	if(b==0) return a;
	else return gcd(b,a%b);
}
struct node{
	long long up,down;
};
void reduction(node& a){
	long long d=gcd(abs(a.up),abs(a.down));
	if(a.down<0) {	//如果分母为负,把负号转移到分子上
		a.up=-a.up;
		a.down=-a.down;
	}
	a.up/=d;
	a.down/=d;
}
void print(node a){
	reduction(a);
	if(a.up==0) printf("0\n");
	else if(abs(a.up)<abs(a.down)) printf("%lld/%lld\n",a.up,a.down);	//真分数
	else if(a.up%a.down==0) printf("%lld\n",a.up/a.down);	//整数
	else{
		 printf("%lld %lld/%lld\n",a.up/a.down,a.up%a.down,a.down);	//带分数
	}
}
int main()
{
	long long n,up,down;
	node ans;
	scanf("%lld",&n);
	for(int i=0;i<n;i++){
		scanf("%lld/%lld",&up,&down);
		if(i==0) {
			ans.up=up;
			ans.down=down;
		}else{
			ans.up=ans.up*down+ans.down*up;
			ans.down*=down;
		}
		reduction(ans);
	}
	print(ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值