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 <stdio.h>
int N;
struct Node
{
	long long int a,b;
};
Node list[110];

long long int gcd(long long int a, long long int b)
{
	if(a < b)
	{
		int temp = a;
		a = b;
		b = temp;
	}
	if(b == 0)
	{
		return a;
	}
	else
	{
		return gcd(b, a % b);
	}
}

Node add(long long int a1, long long int b1, long long int a2, long long int b2)
{
	Node res;
	int fh = 1;
	res.a = a1 * b2 + a2 * b1;
	res.b = b1 * b2;
	if(res.a * res.b < 0)
	{
		fh = -1;
	}
	if(res.a < 0)
	{
		res.a = -res.a;
	}
	if(res.b < 0)
	{
		res.b = -res.b;
	}
	if(res.a != 0)
	{
		long long int d = gcd(res.a, res.b);
		res.a /= d;
		res.b /= d;
		res.a *= fh;
	}
	return res;
}

int main()
{
	while(scanf("%d", &N) != EOF)
	{
		int fh = 1;
		for(int i = 0; i < N; i++)
		{
			scanf("%lld/%lld", &list[i].a, &list[i].b);
			fh = 1;
			if(list[i].a < 0)
			{
				list[i].a = -list[i].a;
				fh = -1;
			}
			if(list[i].a != 0)
			{
				long long int d = gcd(list[i].a, list[i].b);
				list[i].a /= d;
				list[i].b /= d;
				list[i].a *= fh;
			}
		}
		Node res;
		res.a = list[0].a;
		res.b = list[0].b;
		for(int i = 1; i < N; i++)
		{
			Node temp = add(res.a, res.b, list[i].a, list[i].b);
			res.a = temp.a;
			res.b = temp.b;
		}
		fh = 1;
		if(res.a * res.b < 0)
		{
			fh = -1;
		}
		if(res.a < 0)
		{
			res.a = -res.a;
		}
		if(res.b < 0)
		{
			res.b = -res.b;
		}
		if(res.a != 0)
		{
			long long int d = gcd(res.a, res.b);
			res.a /= d;
			res.b /= d;
			res.a *= fh;
			if(res.b == 1)
			{
				printf("%lld\n", res.a);
			}
			else
			{
				if(res.a > res.b)
				{
					printf("%lld %lld/%lld\n", res.a/res.b, res.a % res.b, res.b);
				}
				else
				{
					printf("%lld/%lld\n", res.a, res.b);
				}
			}
		}
		else
		{
			printf("0\n");
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值