PAT 乙級 1034. 有理數四則運算(20)

1034. 有理數四則運算(20)

時間限制
200 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
作者
CHEN, Yue

本題要求編寫程序,計算2個有理數的和、差、積、商。

輸入格式:

輸入在一行中按照“a1/b1 a2/b2”的格式給出兩個分數形式的有理數,其中分子和分母全是整型範圍內的整數,負號只可能出現在分子前,分母不爲0。

輸出格式:

分別在4行中按照“有理數1 運算符 有理數2 = 結果”的格式順序輸出2個有理數的和、差、積、商。注意輸出的每個有理數必須是該有理數的最簡形式“k a/b”,其中k是整數部分,a/b是最簡分數部分;若爲負數,則須加括號;若除法分母爲0,則輸出“Inf”。題目保證正確的輸出中沒有超過整型範圍的整數。

輸入樣例1:
2/3 -4/2
輸出樣例1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
輸入樣例2:
5/3 0/6
輸出樣例2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf


#include <iostream>
#include <cstdio>
using namespace std;
long long int a, b, c, d;

//輾轉相除法:求最大公約數
long long int gcd(long long int t1, long long int t2) {
	return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}

void func(long long int m, long long int n) {
	int flag1 = 0;
	int flag2 = 0;
	if (n == 0) {
		cout << "Inf";
		return;
	}
	if (m == 0) {
		cout << 0;
		return;
	}

	if (m < 0) {
		m = 0 - m;
		flag1 = 1;//分子爲負數
	}
	if (n < 0) {
		n = 0 - n;
		flag2 = 1;//分母爲負數
	}
	int flag = 0;
	if (flag1 == 1 && flag2 == 1) {
		flag = 0;
	}
	else if (flag1 == 1 || flag2 == 1) {
		flag = 1;//分式爲負數
	}
	if (m == n) {
		if (flag == 1)
			cout << "(-1)";
		else
			cout << "1";
		return;
	}

	long long int x = m % n;
	long long int y = m / n;
	if (x == 0) 
	{
		if (flag == 0)
			cout << y;
		else
			cout << "(-" << y << ")";
		return;
	}
	else 
	{
		long long int t1 = m - y * n;//分子
		long long int t2 = n;//分母
		long long int t = gcd(t1, t2);
		t1 = t1 / t;
		t2 = t2 / t;
		if (flag == 1) //爲負數
		{
			cout << "(-";
			if (y != 0)
				cout << y << " " << t1 << "/" << t2;
			else
				cout << t1 << "/" << t2;
			cout << ")";
		}
		else //爲正數
		{
			if (y != 0)
				cout << y << " " << t1 << "/" << t2;
			else
				cout << t1 << "/" << t2;
		}
	}
}

void add() {
	long long int m, n;//m、n分別爲運算結果暫時的分子、分母
	m = a * d + b * c;
	n = b * d;
	func(a, b);
	cout << " + ";
	func(c, d);
	cout << " = ";
	func(m, n);
	cout << endl;
}

void min() {
	long long int m, n;//m、n分別爲運算結果暫時的分子、分母
	m = a * d - b * c;
	n = b * d;
	func(a, b);
	cout << " - ";
	func(c, d);
	cout << " = ";
	func(m, n);
	cout << endl;
}

void multi() {
	long long int m, n;//m、n分別爲運算結果暫時的分子、分母
	m = a * c;
	n = b * d;
	func(a, b);
	cout << " * ";
	func(c, d);
	cout << " = ";
	func(m, n);
	cout << endl;
}

void div() {
	long long int m, n;//m、n分別爲運算結果暫時的分子、分母
	m = a * d;
	n = b * c;
	func(a, b);
	cout << " / ";
	func(c, d);
	cout << " = ";
	func(m, n);
	cout << endl;
}

int main() {
	scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);//中途產生的運算可能超過int表示的範圍
	add();
	min();
	multi();
	div();
	return 0;
}


發佈了111 篇原創文章 · 獲贊 44 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章