A1081 Rational Sum (20分)

一、技术总结

  1. 这题是关于分数四则运算的题目,主要的关键点在于化简函数的编写,以及输出显示函数的编写;
  2. 化简函数的注意点一个是当分子为0的时候,记得将分母赋值为1,如果分子不为0,那么就使用gcd函数进行化简;在一个就是当分母出现负数的时候,为了输出方便要将分子分母的符号转化;
  3. 关于输出显示函数,一般是根据题目的具体要求进行编写,但是不外乎,一个数假分数的显示,还有就是如果是整数单独输出分子即可,也就是分母为1,如果是真分式,那么就简单输出即可;

二、参考代码

#include<iostream>
#include<vector>
using namespace std;
struct Fraction{
	int num, denom;
}; 
int gcd(int a, int b){
	return !b ? a : gcd(b, a % b);
}
Fraction reduction(Fraction a){
	if(a.denom < 0){
		a.num = -a.num;
		a.denom = -a.denom;
	}
	if(a.num == 0){
		a.denom = 1;
	}else{
		int d = gcd(abs(a.num), abs(a.denom));
		a.num /= d;
		a.denom /= d;
	}
	return a;
}
Fraction add(Fraction f1, Fraction f2){
	Fraction c;
	c.num = f1.num * f2.denom + f1.denom * f2.num;
	c.denom = f1.denom * f2.denom;
	return c; 
}
void showResult(Fraction r){
	Fraction c = reduction(r);
	if(c.denom == 1){
		printf("%d", c.num);
	}else{
		if(c.num > c.denom){
			printf("%d %d/%d", c.num / c.denom, abs(c.num) % c.denom, c.denom);
		}else{
			printf("%d/%d", c.num, c.denom);
		}		
	}
}
int main(){
	int n;
	cin >> n;
	Fraction sum, first;
	scanf("%d/%d", &sum.num, &sum.denom);
	for(int i = 1; i < n; i++){
		Fraction ans;
		scanf("%d/%d", &ans.num, &ans.denom);
		sum = add(sum, ans);
	}
	showResult(sum);
	return 0;
}
posted @ 2020-06-30 20:59  睿晞  阅读(98)  评论(0编辑  收藏  举报