天梯赛集 L1-009

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的代码,11分,边界问题很多,代码整体很好看懂(混分)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

//直接模拟,暴力求解

int fz=0;
int fm=0;
int num;
int a,b;
char c;
int main(){
	cin>>num;
	if(num==0) return 0;
	int j=0;
	cin>>fz>>c>>fm;
	if(fm==0) j=1;
	for(int i=0;i<num-1;i++){
		cin>>a>>c>>b;
		if(b==0) j=1;
		fz=fz*b+fm*a;
		fm=fm*b;
		
	}
	
	if(j==1) {
		cout<<"0"<<endl;
		return 0;
	}
	
	int s=__gcd(fz,fm);
	s=abs(s);
	if(s!=0){
		fz/=s;
		fm/=s;	
	}
	
	
	if(abs(fz)%abs(fm)==0)	
	{
		if(fz<0&&fm<0)
			cout<<abs(fz)/abs(fm)<<endl;
		if(fz<0||fm<0)
			cout<<"-"<<abs(fz)/abs(fm)<<endl;
	}
	else if(abs(fz)/abs(fm)>=1){
		int t=fz/fm;
		fz=fz-t*fm;
		cout<<t<<" "<<fz<<"/"<<fm;	
	}
	else{
		cout<<fz<<"/"<<fm;	
	}
	
	return 0;
} 

 

下面的代码是ac的,但是像gcd()求最大公因数,这种可以用algorithm头文件,万能头也可以

最小公倍数是:a*b/__gcd(a,b);

#include<cstdio>
#include<algorithm>
using namespace std;
void f(long int& sa,long int& sb,long int a,long int b){//以sa和sb作为最终分子和最终分母,直接修改
  sa = sa*b + sb*a;
  sb = sb*b;//通分
}
void gcd(long int &a,long int &b){//直接修改a和b的值
  long int r;
  long int M = max(a,b), m = min(a,b);
  while(r=M%m){
    M=m;
    m=r;
  }
  a/=m;
  b/=m;
}
int main(){
  int n;
  scanf("%d",&n);
  long int sa,sb,a,b;
  scanf("%ld/%ld",&sa,&sb);
  for(int i=1; i<n; i++){
    scanf("%ld/%ld",&a,&b);
    f(sa,sb,a,b);
  }
  if(sa == 0){
  	putchar('0');
  }
  else{
	  if(sa/sb){
	    printf("%ld",sa/sb);
	    if(sa%sb) putchar(' ');
	  }
	  if(sa %= sb){
	    gcd(sa,sb);
	    printf("%ld/%ld\n",sa,sb);
	  }
  }
  return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值