【PAT】1081. Rational Sum (20)

本文介绍了一种处理多个有理数相加的方法,并通过化简得到最简形式的算法实现。采用C++编程语言,利用结构体存储分数并定义了求最大公约数的递归函数,确保了分数结果的准确性。

摘要生成于 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 <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;

struct node{
 	node(){
	 }
	node(long int fenzi, long int fenmu){
		fz = fenzi;
		fm = fenmu;
	}	
	long int fz, fm;
};
//求最大公约数 
long int gyc (long int  a,  long int b){
	long int max = a>b? a:b;
	long int min = a<b? a:b;
	if(max%min == 0)
		return min;
	else
		return gyc(min, max%min);	
}

void plusFun(node &a, node &b){
	long int fzA, fmA, fzB, fmB, fz, fm, t;
	fzA = a.fz; 
	fmA = a.fm;
	fzB = b.fz;
	fmB = b.fm; 
	fz = fzA*fmB + fzB*fmA;
	fm = fmA*fmB;
	if(fz != 0){
		//分子为零的情况下不要去求公约数,否则会出错 
		t = gyc(abs(fz),abs(fm));
	}else{
		t = 1;
	}    
	fz /= t;
	fm /= t;	
	a.fz = fz;
	a.fm = fm; 
}


int main(int argc, char** argv) {
	long int N, i, fz, fm;
	cin>>N;
	vector<node> vec;
	node result(0,1);
	node t;
	char ch;
	for(i=0; i<N; i++){
		cin>>fz>>ch>>fm;		 
		vec.push_back(node(fz,fm));
		plusFun(result, vec[i]);		
	}
	long int z;
	z = result.fz/result.fm;
	if(z != 0){
		result.fz =abs(result.fz) -  abs(z) * result.fm ;
		cout<<z;
		if(result.fz == 0)
			return 0 ;
		else
		  cout<<" "<<result.fz<<"/"<<result.fm<<endl;
	}else{
		if(result.fz == 0)
			cout<<"0"<<endl;
		else
			cout<<result.fz<<"/"<<result.fm<<endl;
	}		
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值