PAT A1081 题解


1081 Rational Sum (20 分)
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


题目大意:给定一个自然数n,然后读入n个分数,求n个分数的和,如果是整数的话,直接输出;如果是假分数,则按照带分数形式输出,真分数也直接输出。


题目思路:设定数据结构fenshu,两个成员up和down,设定规则,仅让up有可能为负,所以当down为负数的话,up和down都设为相反数。而当up=0时,设置down=1;找出最大公约数然后让up和down同除。而分数加法运算f1+f2sum.up =f1.up * f2.down + f1.down * f2.up,sum.down=f1.down*f2.down.


#includeiostream
#includealgorithm
typedef long long ll;
using namespace std;
struct fenshu{
	ll up,down;
};
ll gcd(ll a,ll b){
	return b==0?a:gcd(b,a%b);
}
fenshu reduct(fenshu result){
//化简
	if(result.down0){
		result.up=-result.up;
		result.down=-result.down;
	} 
	if(result.up==0){
		result.down=1;
	}
	else{
		int yueshu=gcd(abs(result.up),abs(result.down));
		result.up/=yueshu;
		result.down/=yueshu;
	}
	return result;
}
fenshu add(fenshu f1,fenshu f2){
	fenshu result;
	result.up=f1.up*f2.down+f1.down*f2.up;
	result.down=f1.down*f2.down;
	return reduct(result);
}
void showresult(fenshu f){
	reduct(f); 
	if(f.down==1){
		printf("%lld",f.up);
	}
	else if(abs(f.up)f.down){
		printf("%lld %lld/%lld",f.up/f.down,abs(f.up)%f.down,f.down);
	}
	else{
		printf("%lld/%lld",f.up,f.down);
	}
}
int main(){
	int n;
	cinn;
	fenshu sum,temp;
	sum.up=0;
	sum.down=1;
	for(int i=0;in;i++){
		scanf("%lld/%lld",temp.up,temp.down);
		sum=add(sum,temp);
	}
	showresult(sum);	
	return 0;
} 
最新回复(0)
/jishuE2_2Bh6QP8RTcCgDvrghiRrW9H5SEpmbYqngBED7yMC_2Fg_3D4794883
8 简首页