PAT 1081. 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

//分数和,这种题目就是过程比较繁琐
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[30];
long long getMax(long long a, long long b)
{
	long long int temp = 0;
	while (b)
	{
		temp = b;
		b = a % b;
		a = temp;
	}
	return a;
}

void getR(char str[], int length, long long &num, long long &de, bool &flag)
{
	int i = 0;
	if (str[i] == '+')
	{
		flag = true;
		++i;
	}
	else if (str[i] == '-')
	{
		flag = false;
		++i;
	}
	else 
		flag = true;
	num = 0;
	while (i < length && str[i] != '/')
	{
		num = num * 10 + str[i] - '0';
		++i;
	}
	++i;
	de = 0;
	while (i < length)
	{
		de = de * 10 + str[i] - '0';
		++i;
	}
	long long maxC = getMax(de, num);
	num /= maxC;
	de /= maxC;
}
void getadd(bool &flag1, long long &a1, long long &b1, bool flag2, long long a2, long long b2)
{
	long long maxCom = getMax(b1, b2);
	long long minG = b1 * b2 / maxCom;
	a1 *= minG / b1;
	a2 *= minG / b2;
	if ((flag1 && flag2) || (!flag1 && !flag2))
		a1 += a2;
	else
		a1 -= a2;
	if (a1 < 0)
	{
		flag1 = !flag1;
		a1 = -a1;
	}
	b1 = minG;
	maxCom = getMax(a1, b1);
	a1 /= maxCom;
	b1 /= maxCom;
		
}
int main(void)
{
	int n;
	long long a1, b1, a2, b2;
	bool flag1, flag2;
	scanf("%d", &n);
	if (n > 0)
	{
		scanf("%s", str);
		getR(str, strlen(str), a1, b1, flag1);
	}
	for (int i = 1; i < n; ++i)
	{
		scanf("%s", str);
		getR(str, strlen(str), a2, b2, flag2);	
		getadd(flag1, a1, b1, flag2, a2, b2);
	}
	if (a1 == 0)
	{
		printf("0\n");
		return 0;
	}
	if (!flag1)
		printf("-");
	if (a1 / b1 > 0)
		printf("%lld", a1 / b1);
	if (a1 / b1 > 0 && a1 % b1 != 0)
		printf(" ");
	if (a1 % b1 != 0)
	{
		printf("%lld/%lld", (a1 % b1), b1);
	}
	printf("\n");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值