打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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 分母

来源:https://www.icode9.com/content-4-654301.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
1006. 求和游戏
2009腾讯创新大赛 题二
1623826884621
PCM音频重采样,音量控制(c实现)
深入浅出DirectShow Filter(二)
关于GraphicsMagick+im4java的研究心得【原创】
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服