PAT A1081 Rational Sum (20) [分数的四则运算]

题目

题目链接
求几个分数的和

解题思路

1 分数存储
2 分数化简
3 分数打印
4 分数运算-加

易错点

1 分数化简中,分子为0,分母要记得置为1
2 加和之后记得化简
3 最大公约数的计算使用分子分母绝对值计算,如果最大公约数为负数,化简后格式又不满足符号在分子的要求了
4 假分数的判定为分子绝对值大于分母,因为符号在分子上

单词语法

denominator 分母
numerator 分子
range 范围
rational numbers 有理数
rational 理性的;合理的

Code

Code 01

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
// 分数存储
struct Fraction {
	int u;//up
	int d;//down
};

// 最大公约数
int gcd(int a, int b) {
	if(b==0)return abs(a);
	else return gcd(b,a%b);
}
// 分数化简
Fraction reduction(Fraction fra) {
	if(fra.d<0) {
		// 分母小于0,分子分母同时变号
		fra.d*=-1;
		fra.u*=-1;
	}
	if(fra.u==0) {
		//分子为0,分母置为1
		fra.d=1;
	} else {
		// 有公约数,消去公约数
		int gc = gcd(abs(fra.d),abs(fra.u));
		fra.u/=gc;
		fra.d/=gc;
	}
	return fra;
}
// 分数打印
void show(Fraction fra) {
	//化简
	fra = reduction(fra);
	//若分母为1,直接打印分子
	if(fra.d==1)printf("%d",fra.u);
	// 若为假分数,打印整数+真分数
	else if(abs(fra.u)>fra.d) {
		printf("%d %d/%d", fra.u/fra.d, abs(fra.u)%fra.d, fra.d);
	}else {
		printf("%d/%d", fra.u, fra.d);
	}
}
// 分数相加 
Fraction add(Fraction a, Fraction b) {
	Fraction c;
	c.u = a.u*b.d+a.d*b.u;
	c.d = a.d*b.d;
	return reduction(c);
}
int main(int argc,char * argv[]) {
	int n;
	Fraction ans;
	scanf("%d",&n);
	for(int i=0; i<n; i++) {
		Fraction temp;
		scanf("%d/%d",&temp.u,&temp.d);
		if(i==0)ans=temp;
		else ans = add(ans,temp); 
	}
	show(ans);
	return 0;
}

Code 02

#include <iostream>
#include <cstdlib>
using namespace std;
long long gcd(long long a, long long b) {
	return b == 0 ? abs(a) : gcd(b, a % b);
}
int main() {
	long long n, a, b, suma = 0, sumb = 1, gcdvalue;
	scanf("%lld", &n);
	for(int i = 0; i < n; i++) {
		scanf("%lld/%lld", &a, &b);
		gcdvalue = gcd(a, b);
		a = a / gcdvalue;
		b = b / gcdvalue;
		suma = a * sumb + suma * b;
		sumb = b * sumb;
		gcdvalue = gcd(suma, sumb);
		sumb = sumb / gcdvalue;
		suma = suma / gcdvalue;
	}
	long long integer = suma / sumb;
	suma = suma - (sumb * integer);
	if(integer != 0) {
		printf("%lld", integer);
		if(suma != 0) printf(" ");
	}
	if(suma != 0)
		printf("%lld/%lld", suma, sumb);
	if(integer == 0 && suma == 0)
		printf("0");
	return 0;
}
posted @ 2020-07-19 11:07  JamieHou  阅读(153)  评论(0编辑  收藏  举报