题面
问题描述
实现两个分数的加法和减法运算,负分数的分子为负数。
输入格式
第一行输入第一个分数的分子和分母,两者之间用空格隔开,分子在前,分母在后。第
二行输入第二个分数的分子和分母,两者之间用空格隔开,分子在前,分母在后。
输出格式
输出两行,第一行输出两个分数的和的分子和分母,两者之间用空格隔开,分子在前,
分母在后。第二行输出两个分数的差的分子和分母,两者之间用空格隔开,分子在前,分母
在后。
样例输入 1
1 2
1 3
样例输出 1
5 6
1 6
样例输入 2
1 4
-5 6
样例输出 2
-7 12
13 12
题解
巨坑的一题,看到long long就知道我急了
坑点
- 负数在分子上(输出时要注意,输入时要默认分子可以为负数、分母为正数)
- 输出的是真分数形式(意味着要化简)
- 求最大公约数(最小公倍数)时注意正负
总体思路
- 将输入的两个分子分母化简为真分数
- 通分
- 算出两分数之和与之差的分子和分母,并化简为真分式
- 输出
具体代码实现(含详细思路)
#include <iostream>
#include <cmath>
using namespace std;
inline long long gcd (long long a, long long b) // 求最大公约数,但是返回的是正整数
{
while (b ^= a ^= b ^= a %= b);
return abs(a);
}
long long Numerator1, Denominator1, Numerator2, Denominator2; // 定义分子1,分母1,分子2,分母2
long long Common_Denominator1, Common_Denominator2; // 公分母,但是因为要分别处理所以定义了两个
int main()
{
cin >> Numerator1 >> Denominator1 >> Numerator2 >> Denominator2;
// 处理输入的分子分母,分别化简为真分式
long long gcdN1D1 = gcd (Numerator1, Denominator1);
Numerator1 /= gcdN1D1;
Denominator1 /= gcdN1D1;
long long gcdN2D2 = gcd (Numerator2, Denominator2);
Numerator2 /= gcdN2D2;
Denominator2 /= gcdN2D2;
// 通分
Common_Denominator1 = Denominator1 * Denominator2 / gcd (Denominator1, Denominator2);
Common_Denominator2 = Denominator1 * Denominator2 / gcd (Denominator1, Denominator2);
Numerator1 *= Common_Denominator1 / Denominator1;
Numerator2 *= Common_Denominator2 / Denominator2;
// 算出两分子之和、之差
long long Numerator1plus2 = Numerator1 + Numerator2;
long long Numerator1minus2 = Numerator1 - Numerator2;
// 再次处理和式和减式的分子分母,分别化简为真分式
long long gcdN1p2CD1 = gcd (Numerator1plus2, Common_Denominator1);
Numerator1plus2 /= gcdN1p2CD1;
Common_Denominator1 /= gcdN1p2CD1;
long long gcdN1m2CD2 = gcd (Numerator1minus2, Common_Denominator2);
Numerator1minus2 /= gcdN1m2CD2;
Common_Denominator2 /= gcdN1m2CD2;
// 输出
cout << Numerator1plus2 << ' ' << Common_Denominator1 << '\n' << Numerator1minus2 << ' ' << Common_Denominator2;
return 0;
}
纯享版代码(无注释)
#include <iostream>
#include <cmath>
using namespace std;
inline long long gcd (long long a, long long b)
{
while (b ^= a ^= b ^= a %= b);
return abs(a);
}
long long Numerator1, Denominator1, Numerator2, Denominator2;
long long Common_Denominator1, Common_Denominator2;
int main()
{
cin >> Numerator1 >> Denominator1 >> Numerator2 >> Denominator2;
long long gcdN1D1 = gcd (Numerator1, Denominator1);
Numerator1 /= gcdN1D1;
Denominator1 /= gcdN1D1;
long long gcdN2D2 = gcd (Numerator2, Denominator2);
Numerator2 /= gcdN2D2;
Denominator2 /= gcdN2D2;
Common_Denominator1 = Denominator1 * Denominator2 / gcd (Denominator1, Denominator2);
Common_Denominator2 = Denominator1 * Denominator2 / gcd (Denominator1, Denominator2);
Numerator1 *= Common_Denominator1 / Denominator1;
Numerator2 *= Common_Denominator2 / Denominator2;
long long Numerator1plus2 = Numerator1 + Numerator2;
long long Numerator1minus2 = Numerator1 - Numerator2;
long long gcdN1p2CD1 = gcd (Numerator1plus2, Common_Denominator1);
Numerator1plus2 /= gcdN1p2CD1;
Common_Denominator1 /= gcdN1p2CD1;
long long gcdN1m2CD2 = gcd (Numerator1minus2, Common_Denominator2);
Numerator1minus2 /= gcdN1m2CD2;
Common_Denominator2 /= gcdN1m2CD2;
cout << Numerator1plus2 << ' ' << Common_Denominator1 << '\n' << Numerator1minus2 << ' ' << Common_Denominator2;
return 0;
}
date:20240103