1081 Rational Sum -PAT甲级(分数运算)

本文介绍了一种处理分数加法并将其结果自动简化的算法。通过定义分数结构体,实现分数的加法运算,利用最大公约数进行分数的简化,并最终输出最简形式的整数部分和分数部分。代码示例展示了如何输入多个分数,计算它们的总和并以最简形式输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<bits/stdc++.h>
using namespace std;
struct Fraction{
	int son;//分子
	int mother;//分母;
	Fraction(){};
	Fraction(int s,int m){
		son=s;
		mother=m;
	} 
};
int gcd(int a,int b){
	//求两个数的最大公约数
	if(b==0) return a;
	return gcd(b,a%b); 
}
//分数的加法 
Fraction add(Fraction a,Fraction b){
	Fraction c;
	c.mother=a.mother*b.mother;
	c.son=a.son*b.mother+b.son*a.mother;
	return c;
}
//分数的约分
Fraction reduction(Fraction &a){
	if(a.son==0){
		a.mother=1;
		return a;
	}
	if(a.mother<0){
		a.mother=-a.mother;
		a.son=-a.son;
	}
	int d=gcd(abs(a.son),a.mother);
	a.mother/=d;
	a.son/=d;
	return a;
} 
void output(Fraction c){
	c=reduction(c);
	if(c.mother==1){
		cout<<c.son<<endl;
		return;
	}
	if(abs(c.son)>c.mother){
		cout<<c.son/c.mother<<" "<<c.son%c.mother<<"/"<<c.mother<<endl;
	}else{
		cout<<c.son<<"/"<<c.mother<<endl;
	}
		
}
int n;
int main(){
	scanf("%d",&n);
	Fraction first,last;
	for(int i=1;i<=n;i++){
		int son,mother;
		scanf("%d/%d",&son,&mother);
		if(i==1){
			first={son,mother};
			continue;
		}
		last={son,mother};
		last=add(first,last);
		first=last;	
		
	}
	output(first);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值