ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PAT A1081 Rational Sum (20分)

2020-03-09 21:41:11  阅读:367  来源: 互联网

标签:分数 Sample PAT A1081 numerator up down Fraction 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 分母

标签:分数,Sample,PAT,A1081,numerator,up,down,Fraction,20
来源: https://blog.csdn.net/PanYiAn9/article/details/104761479

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有