PAT 甲级 A1088 Rational Arithmetic

算法笔记

考前要看看,涉及分数的四则运算和化简,求最大公约数

#include 
#include 
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) { // 求最大公约数 
	return b == 0 ? a : gcd(b, a % b); 
}
struct Fraction { // 定义分子分母 
	ll up, down;
}a, b;

Fraction reduction(Fraction result) { // 化简
	if(result.down < 0) {
		result.up = -result.up;
		result.down = -result.down;
	} 
	if(result.up == 0) {
		result.down = 1;
	} else { // 如果分子不为零,则约分 
		int d = gcd(abs(result.up), abs(result.down)); // 约分时取绝对值
		result.up /= d;
		result.down /= d;	 
	}
	return result;
}

Fraction add(Fraction f1, Fraction f2) { // 分数相加 
	Fraction result; 
	result.up = f1.up * f2.down + f2.up * f1.down;  // 分数和的分子 
	result.down = f1.down * f2.down;
	return reduction(result); // 返回化简后的结果 
}

Fraction minu(Fraction f1, Fraction f2) { // 分数相减
 	Fraction result;
 	result.up = f1.up * f2.down - f2.up * f1.down;
 	result.down = f1.down * f2.down;
 	return reduction(result);	
} 

Fraction multi(Fraction f1, Fraction f2) {// 相乘 
		Fraction result;
		result.up = f1.up * f2.up;
		result.down = f1.down * f2.down;
		return reduction(result);
}

Fraction divide(Fraction f1, Fraction f2) { //相除 
	Fraction result;
	result.up = f1.up * f2.down;
	result.down = f1.down * f2.up;
	return reduction(result);
}

void showResult(Fraction r) { // 输出分数 
	r = reduction(r);
	if(r.up < 0) printf("(");
	if(r.down == 1) printf("%lld", r.up); // 整数 
	else if(abs(r.up) > r.down) {
		printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
	} else {
		printf("%lld/%lld", r.up, r.down);
	}
	if(r.up < 0) printf(")");
}

int main() {
	scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
	// 加法
	showResult(a);
	printf(" + ");
	showResult(b);
	printf(" = ");
	showResult(add(a, b));
	printf("\n"); 
	// 减法
	showResult(a);
	printf(" - ");
	showResult(b);
	printf(" = ");
	showResult(minu(a, b));
	printf("\n");
	// 乘法
	showResult(a);
	printf(" * ");
	showResult(b);
	printf(" = ");
	showResult(multi(a, b));
	printf("\n"); 
	// 除法
		showResult(a);
	printf(" / ");
	showResult(b);
	printf(" = ");
	if(b.up == 0) printf("Inf");
	else showResult(divide(a, b));
	printf("\n");  
	return 0;
}
 










 

你可能感兴趣的:(PAT甲级)