求N个有理数的和

编写程序,求N个有理数的和

每个有理数均以分子/分母的形式给出,你输出的和也必须是有理数的形式。

Input

第一行给出一个正整数N(≤100)。

随后一行给出N个有理数,中间用空格隔开,每个有理数均以分子/分母的形式给出。

题目保证所有分子和分母都在long long范围内。另外,负数的符号一定出现在分子前面。

Output

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

如果结果的分数部分为0,则只输出整数部分;然后,如果结果的整数部分为0,则只输出分数部分。

Sample Input 1 

5

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

Sample Output 1

3 1/3


求公因数——辗转相除法

//先看看这个函数吧:
int gcd(int a,int b)
{
	int t;
	while(b!=0)
    {
		t=a%b;
 		a=b;
		b=t;
    }
    return a;    //a是最大公因数
}
//这里是辗转相除法的递归【b!=0的条件】t=a%b;a=b;b=t;【a为最大公因数】
//递归函数
int gcd(long long int p, long long int q)
{
	if (p%q == 0)
		return q;
	else
		return gcd(q, p%q);	//相当于while里面的交换
}
//这个是求最大公因数咯 

 


#include<stdio.h>
int gcd(long long int p, long long int q)
{
	if (p%q == 0)
		return q;
	else
		return gcd(q, p%q);	
}
//这个是求最大公因数咯 


int main()
{
	long long int a, b,suma = 0, sumb = 1,m;
	int n, i;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%lld/%lld", &a, &b);
        //不仅要输入分子分母,还要让其与后面的一起另一个分数加和
		suma *= b;
        //suma为分子,通分乘以分母
		suma = (suma + a*sumb);
        //下个分子乘以上一个分母,
		sumb *= b;			//分母相乘通分
        //化简分子和分母,就是求出最大公因数后两者一起化简,相当于求最小公倍数
		m = gcd(suma, sumb);
		suma /= m;
		sumb /= m;
	}



    //真分数情况  格式的输出注意
	if (suma&&(suma/sumb==0)){
		if(sumb>0) printf("%lld/%lld\n", suma, sumb);
		if(sumb<0) printf("%lld/%lld\n", -suma, -sumb);
	}
    //假分数  要输出整数和分数
	else if (suma%sumb==0)
		printf("%lld\n", suma / sumb);		//一个整数
	else					                //整数和分数
	{
	    if (suma/sumb<0){
	        if(sumb>0) printf("%lld %lld/%lld\n",suma/sumb,suma%sumb,sumb);
	        if(sumb<0) printf("%lld %lld/%lld\n",suma/sumb,-suma%sumb,-sumb);
	    }
		else printf("%lld %lld/%lld\n",suma/sumb,suma%sumb,sumb);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值