L1-009. N个数求和

               L1-009. N个数求和

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

本题的要求很简单,就是求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

提交代

把int 型改为long long int 会输出错误,不知道哪里错了,提交了六次都是12分

12分的代码

#include <iostream>
#include <math.h>
#include<algorithm>
#include<stdio.h>
#include<string.h> 
#include<map>
using namespace std;
int gy(int n,int m)//计算公约数 
{
	int r,t;
	if(n<m) t=n,n=m,m=t;
	r=n%m;
	while(r)
	{
		n=m;
		m=r;
		if(n<m) t=n,n=m,m=t;
		r=n%m;
	}
	return m;
}
int sumx(int x1,int y1,int x2,int y2)
{
	int s;
	int temp=y1*y2/gy(y1,y2);
	s=temp/y1*x1+temp/y2*x2;
	return s;
}
int sumy(int x1,int y1,int x2,int y2)
{
	int s;
	int temp=gy(y1,y2);
	s=y1*y2/gy(y1,y2);
	return s;
}
int show(int x,int y)
{   
	if(x==0)
	{
		cout<<0<<endl;
	}
	else
	{
		if(x<y)
		{
			cout<<x<<"/"<<y<<endl;
		}
		if(x==y)
			cout<<1<<endl;
		if(x>y)
		{
			if(x%y==0)
		     cout<<x/y<<endl;
			if(x%y!=0)
			{   
				cout<<x/y<<" "<<x%y<<"/"<<y<<endl; 
			}
	   } 
   }	
}
int show1(int x,int y)
{   
	if(x==0)
	{
		cout<<0<<endl;
	}
	else
	{   
	    int temp=gy(x,y);
	    x=x/temp;
	    y=y/temp;
		if(x<y)
		{
			cout<<x<<"/"<<y<<endl;
		}
		if(x==y)
			cout<<1<<endl;
		if(x>y)
		{
			if(x%y==0)
		     cout<<x/y<<endl;
			if(x%y!=0)
			{   
				cout<<x/y<<" "<<x%y<<"/"<<y<<endl; 
			}
	   } 
   }	
}
int main()
{
	int n;
	cin>>n; 
	int x1,y1,x2,y2,t;
	scanf("%d/%d",&x2,&y2);
	if(n==1)
	{
		show1(x2,y2);
	}
	else
	{
		x1=x2;
	    y1=y2;
		for(int i=1;i<n;i++)
		{
			scanf("%d/%d",&x2,&y2);
			if(x2==0)
				continue;
			else
			{
				x1=sumx(x1,y1,x2,y2);
				y1=sumy(x1,y1,x2,y2);
		        t=gy(x1,y1);
		        x1=x1/t;
		        y1=y1/t; 
			}
			  
		}
		show(x1,y1);	
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值