这种问题主要是化简和规范问题,没有啥技巧性。通过一个结构体数组来表示一个分数:
分数表示
struct Fraction{
long long up,down;
}
注意事项
需要注意的是下面三个规则:
-
分子down大于零。若分数为负数,则令分子和分母都取相反数。
-
若分数为0,这令分子up为0,分母down为1。
-
分子和分母都没有除了1之外的公约数。
代码实现
写一遍代码熟悉一下:
#include<cstdio>
#include<cmath>
typedef long long ll;
struct Fraction{
ll up,down;
};
//求最大公约数
ll gcd(ll a, ll b){
if(b==0)return a;
else return gcd(b,a%b);
}
//化简操作
Fraction reduction(Fraction result){
if(a.down < 0){
result.up = -result.up;
result.down = -result.down;
}
if(result.up == 0){
result.down = 1;
}else{
ll d = gcd(abs(result.up),abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
//加法
Fraction add(Fraction a, Fraction b){
Fraction result;
result.up = a.up*b.down + a.down*a.up;
result.down = a.down * b.down;
return reduction(result);
}
//减法
Fraction minu(Fraction a, Fraction b){
Fraction result;
result.up = a.up*b.down - a.down*b.up;
result.down = a.down*b.down;
return reduction(result);
}
//乘法
Fraction multi(Fraction a , Fraction b){
Fraction result;
result.up = a.up*b.up;
result.down = a.down*b.down;
return reduction(result);
}
//除法
Fraction div(Fraction a, Fraction b){
Fraction result;
result.up = a.up*b.down;
result.down = a.down*b.up;
return reduction(result);
}
//打印
void showResult(Fraction r){
r = reduction(r);
if(r.down == 1)printf("%lld",r.up);
else{
if(abs(r.up)>abs(r.down)){
printf("%d %d/%d",r.up/r.down,abs(r.up)%r.down,r.down);
}else{
printf("%d/%d",r.up,r.down);
}
}
}
注意到除法的时候可能在输入的时候需要判断除数是否为0。