一 分数的表示和化简
1 分数的表示
对一个分数来说,最简洁的写法就是写成假分数的形式,即无论分子比分母大或者小,都保留其原数。因此可以用一个结构体来存储这种只有分子和分母的分数:
struct Fraction///结构体表示一个分数
{
int up; ///分子
int down;///分母
};
于是可以定义Fraction 类型的变量来表示分数,或者定义一个结构体数组来定义一堆分数。其中需要对这种表示制定三项规则:
(1) 使down 为非负数。如果分数为负,那么令分子 up 为负即可。
(2) 如果分数恰为零,那么规定其分子为0,分母为 1.
(3) 分子和分母没有除了 1 之外的公约数
2 分数的化简
分数的化简主要用来使 Fraction 变量满足分数表示的三项规定,因此化简的步骤也可分为以下三步:
(1) 如果分母 down 为负数,那么令分子 up 和分母 down 都变为相反数。
(2) 如果分子 up为 0,那么另分母 down为 1;
(3)约分:求出分子绝对值与分母绝对值的最大公约数 d ,然后令分子分母同时除以 d 。
代码如下:
Fraction reduction(Fraction result)///分数化简
{
if(result.down<0)///使分母为非负数,如果分数为负,使分子为负
{
result.up=-result.up;
result.down=-result.down;
}
if(result.up==0)///如果分数为0,规定其分子为0,分母为 1
{
result.down=1;
}
else ///化成最简分数
{
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
二 分数的四则运算
1 分数的加法
对两个分数 f1 和 f2,其加法的计算公式为:
Fraction add(Fraction f1,Fraction f2)///分数的加法
{
Fraction result;
result.up=f1.up*f2.down+f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
2 分数的减法
对两个分数 f1 和 f2,其减法的计算公式为:
Fraction minu(Fraction f1,Fraction f2)///分数的减法
{
Fraction result;
result.up=f1.up*f2.down-f1.down*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
3 分数的乘法
对两个分数 f1 和 f2,其乘法的计算公式为:
Fraction multi(Fraction f1,Fraction f2)///分数的乘法
{
Fraction result;
result.up=f1.up*f2.up;
result.down=f1.down*f2.down;
return reduction(result);
}
4 分数的除法
对两个分数f1 和 f2 ,其除法的计算公式为:
Fraction divide(Fraction f1,Fraction f2)///分数的除法
{
Fraction result;
result.up=f1.up*f2.down;
result.down=f1.down*f2.up;
return reduction(result);
}
三 分数的输出
分数的输出要根据题目的需要进行输出,但是大体上有以下几个注意点:
(1) 输出分数前,需要对其进行化简
(2) 如果分数 r 的分母 down 为 1,说明该分数是整数,一般来说题目会要求直接输出分子,而省略分母的输出
(3) 如果分数 r 的分子 up 的绝对值大于分母 down ,说明该分数是假分数,此时应该按 带分数的形式输出,即整数部分为 r.up/r.down, 分子部分为 abs(r.up)%r.down, 分母部分为 r.down.
(4) 以上均不满足时说明分数 r 是真分数,按原样输出即可。
以下是一个输出示例:
void showResult(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);
}
}
强调一点: 由于分数的乘法和除法过程中可能使分子或分母超过 int 型的范围,因此一般情况下,分子和分母应使用long long 型存储。