1 分数的表示与化简
1.1 分数的表示
struct Fraction{ // 分数
long long up; // 分子
long long down; // 分母
};
其中规定:
- 使用down为非负数。若分数为负,那么令分子up为负即可。
- 若该分数恰好为0,那么规定其分子为0,分母为1。
- 分子和分母没有除了1以外的公约数。
1.2 分数的化简
化简的目的是使Fraction变量满足分数表示的三项规定,化简的步骤因而分如下三步:
- 若分母down为负数,那么令分子up和分母down都变为相反数。
- 若分子up为0,那么令分母down为1。
- 约分:求出分子绝对值与分母绝对值的最大公约数d,然后令分子分母同时除以d。
Fraction reduction(Fraction result) {
if(result.down < 0) {
result.up = -result.up;
result.down = -result.down;
}
if(result.up == 0)
result.down = 1;
else {
long long d = gcd(abs(result.up),abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
2 分数的四则运算
2.1 分数的加法
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);
}
2.2 分数的减法
Fraction sub(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);
}
2.3 分数的乘法
Fraction mul(Fraction f1,Fraction f2) {
Fraction result;
result.up = f1.up*f2.up;
result.down = f1.down*f2.down;
return reduction(result);
}
2.4 分数的除法
Fraction div(Fraction f1,Fraction f2) {
Fraction result;
result.up = f1.up*f2.down;
result.down = f1.down*f2.up;
return reduction(result);
}
分数的除法在使用前应注意,除数f2不能为0
3 补充
在分数的四则运算中,要时刻注意结果的取值范围是否会发生溢出现象