一、分数的表示与化简
用结构体表示分数。
typedef struct tagFraction
{
int up;
int down;
}Fraction;
作一个约定:
①使分母down非负。如果分母为负数,那么令分子和分母都变为相反数。
②如果分数为0,那么令分母down为1。
③分子和分母没有除了1以外的公约数。可以令分子、分母同时除以最大公约数来实现。
化简分数使其满足这三条规则。
//求最大公约数,辗转相除法递归实现
int gcd(int a, int b)
{
//递归边界 b=0
if(0 == b)
{
return a;
}
else
{
return gcd(b, a%b);
}
}
// 化简为约定的形式
Fraction reduction(Fraction r)
{
if(r.down < 0)//使分母非负
{
r.up = -r.up;
r.down = -r.down;
}
if(r.up == 0)
{
r.down = 1;
}
else
{
int d = gcd(abs(r.up), abs(r.down));
r.up /= d;
r.down /= d;
}
return r;
}
二、分数四则运算
2.1 分数加法
//分数加法
Fraction addFraction(Fraction f1, Fraction f2)
{
Fraction r;
r.up = f1.up * f2.down + f2.up * f1.down;
r.down = f1.down * f2.down;
return reduction(r);
}
2.2 分数减法
//分数减法
Fraction minusFraction(Fraction f1, Fraction f2)
{
Fraction r;
r.up = f1.up * f2.down - f2.up * f1.down;
r.down = f1.down * f2.down;
return reduction(r);
}
2.3 分数乘法
// 分数乘法
Fraction multiFraction(Fraction f1, Fraction f2)
{
Fraction r;
r.up = f1.up * f2.up;
r.down = f1.down * f2.down;
return reduction(r);
}
2.4 分数除法
// 分数除法
Fraction divideFraction(Fraction f1, Fraction f2)
{
Fraction r;
r.up = f1.up * f2.down;
r.down = f1.down * f2.up;
return reduction(r);
}
三、显示分数
void showFraction(Fraction r)
{
r = reduction(r);
if(r.down == 1)
{
printf("%d\n", r.up);//输出整数
}
else if(abs(r.up)>r.down)//假分数
{
//输出带分数
printf("%d,%d/%d\n", r.up/r.down, abs(r.up)%r.down, r.down);
}
else{
printf("%d/%d\n", r.up, r.down);
}
}