PAT(甲级)1081

1081. Rational Sum (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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
该题在输出负的假分数时要注意格式,跟先前的一题有区别!!
#include <cstdio>
#include <iostream>

using namespace std;
//
//1.remember that the input asures the demoninator is a possitive integer,so
//no need to deal with the case
//2.the simplest form of -10/3 is -3 -1/3 not -3 1/3
//3.when calculate mygcd,make sure numerator is nonzero

long long mygcd(long long a,long long b){
	if(a < 0)
	    a = -a;
//	if(b < 0)
//	    b =-b;
	if(a > b){
		int tmp=a;
		a=b;
		b=tmp;
	}
	while(b%a !=0){
		int tmp=b%a;
		b =a;
		a = tmp;
	}
	return a;
}

void add(long long &numerator1,long long &denominator1,long long &numerator2,long long &denominator2){
	int factor;
	if(numerator2 !=0){
		factor = mygcd(numerator2,denominator2);
		numerator2 /=factor;
		denominator2 /=factor;
	}
	numerator1 = numerator1*denominator2+numerator2*denominator1;
	denominator1 = denominator1*denominator2;
	if(numerator1 == 0){          //if numerator1 is zero, return 
		denominator1 = 1;
		return ;
	}
	factor = mygcd(numerator1,denominator1);
	numerator1 = numerator1/factor;
	denominator1 = denominator1/factor;
}

int main()
{
	int times;
	long long numerator1,denominator1,numerator,denominator;
	scanf("%d",×);
	scanf("%lld/%lld",&numerator1,&denominator1);
	for(int i=0;i<times-1;i++){
		scanf("%lld/%lld",&numerator,&denominator);
		add(numerator1,denominator1,numerator,denominator);
	}
	if(denominator1 == 1)           //integer part no fraction part including zero
	    cout <<numerator1 <<endl;
	else{
		if(numerator1 > denominator1 || (-numerator1) > denominator1)  //integer part plus fraction part
			cout <<numerator1/denominator1 <<' ' <<numerator1%denominator1  <<'/' <<denominator1 <<endl;
		else               //only fraction part
			cout <<numerator1 <<'/' <<denominator1 <<endl;
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值