1. 程式人生 > 實用技巧 >PAT A1081 Rational Sum (20) [分數的四則運算]

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(fra.d,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;
}