L1-009 N个数求和 (20 分)

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

 ac代码:

#include<iostream>
using  namespace std;
int n,x1,x2,y1,y2,i1,i2;

/*
 1 . 输入 x2 y2  化为最简(最大公因数) 。查看 x1 y1 有没有值 没有就说明是第一次输入
    赋值给x1 y1 继续输入   
 2 . 进行加减  结果优化为最简(最小公倍数) 最简分母为 1  
 3 . 把整数弄出来  如果没有余值 就只输出一个整数  

*/
int pan(int u,int v)
{
	if(i1<0 && i2<0) return 0;
	else if(i1<0 && i2>0) return 1;
	else if(i1>0 && i2<0) return 2;
	else return 3;	
}
int max_xx(int u,int v)
{
	int l = u,r = v;
	while(r)
	{
		int n = l % r;
		l = r;
		r = n;
	}
	
	return l; 
}

int main()
{
	scanf("%d",&n);
	
	while(n--)
	{
		scanf("%d%*c%d",&x2,&y2);
		if(x2<0) 
		{
			i2 = -1;
			x2 *= -1; 
		} 
		else
			i2 = 1;
		
		// 化为最简 
		int u = max_xx(x2,y2); 
		x2 = x2 / u;
		y2 = y2 / u;
		
		if(!x1 && !y1) 
		{
			x1 = x2;
			y1 = y2;
			i1 = i2; 
			continue;
		}
		
		// 进行加减
		u = max_xx(y1,y2);
		u = y1*y2/u;	// 找到最小公倍数 
		x1 = u/y1*x1;	 // 重置分子 
		x2 = u/y2*x2;
		y1 = y2 = u; 	// 重置分母 
		
		switch(pan(i1,i2))
		{
			case 0: x1 = x1+x2; break; // i1 不用变
			case 1: x1 = x1-x2; break; // 如果x1<0 i1需要变号 
			case 2: x1 = x1-x2; break; //eg: -2 +3 = 1 ,2-3=-1 变号 
			case 3: x1 = x1+x2; break; 
		}
		if(x1<0) 
		{
			x1 *= x1; i1 *=-1;
		}
		
		// 化为最简
		u = max_xx(x1,y1);
		x1 = x1/u;
		y1 = y1/u;
		
	}
	
	// x1 和 y1 
	int k = x1 / y1;
	x1 = x1 % y1;
	if(y1 == 1)
	{
		if(i1>0)
			cout<<k;
		else
			cout<<"-"<<k; 
	}	
	else
	{
		if(i1>0)
		{
			if(k!=0)
				cout<<k<<" "<<x1<<"/"<<y1;
			else 
				cout<<x1<<"/"<<y1;
		}
		else
		{
			if(k!=0)
				cout<<k<<" -"<<x1<<"/"<<y1;
			else
				cout<<"-"<<x1<<"/"<<y1;
		}	
	}
	
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值