分数的定义:
struct Fraction{
int up;//分子
int down;//分母
};
最大公约数:
//最大公约数
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
最小公倍数:
//最小公倍数
int lcm(int a,int b){
return a*b/gcd(a,b);
}
分数的化简:
Fraction reduction(Fraction f){
if(f.down<0){
f.up=-f.up;
f.down=-f.down;
}
if(f.up==0) f.down=1;
else{
int d=gcd(f.up,f.down);
f.up/=d;
f.down/=d;
}
return f;
}
分数的加减乘除:
Fraction add(Fraction a,Fraction b){
Fraction f;
f.up=a.up*b.down+a.down*b.up;
f.down=a.down*b.down;
return reduction(f);
}
Fraction sub(Fraction a,Fraction b){
Fraction f;
f.up=a.up*b.down-a.down*b.up;
f.down=a.down*b.down;
return reduction(f);
}
Fraction multi(Fraction a,Fraction b){
Fraction f;
f.up=a.up*b.up;
f.down=a.down*b.down;
return reduction(f);
}
Fraction divide(Fraction a,Fraction b){
Fraction f;
f.up=a.up*b.down;
f.down=a.down*b.up;
return reduction(f);
}
分数的输出:
void showFraction(Fraction f){
f=reduction(f);//先化简
if(f.down==1)printf("%d",f.up);//整数
else if(abs(f.up)>f.down){
printf("%d %d/%d",f.up/f.down,abs(f.up)%f.down,f.down);//假分数
}else{
printf("%d/%d",f.up,f.down);//真分数
}
}