点击查看代码
#include<cstdio>
#include<algorithm> //abs()
#pragma warning(disable:4996)
//存储分数
struct Fraction {
int up, down; //分子和分母
};
//求a与b的最大公约数(要求a>b,如果a<b则先交换两者再调用该函数)
int gcd_func(int a, int b) {
if (b == 0) return a;
else return gcd_func(b, a % b);
}
/*
分数的化简
表示分数的三项规则:
(1)保证分母是非负数。如果分母是负数,则令分子分母都变为相反数
(2)如果分数为0,则使分子为0,分母为1
(3)求最大公约数d,令分子和分母分别除以d进行约分,保证分子和分母除了1以外没有其他公约数
*/
Fraction reduction(Fraction result) {
if (result.down < 0) { //规则(1)
result.up = -result.up;
result.down = -result.down;
}
if (result.up == 0) { //规则(2)
result.down = 1;
}
else { //规则(3)
int d = gcd_func(abs(result.up), abs(result.down));
result.up /= d; //约去最大公约数
result.down /= d;
}
return result;
}
//分数的加法(f1+f2)
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); //注意要先化简再返回结果
}
//分数的减法(f1-f2)
Fraction minu(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); //注意要先化简再返回结果
}
//分数的乘法(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); //注意要先化简再返回结果
}
//分数的除法(f1/f2),除数不为0(f2.up不为0)才能进行除法
//如果除数为0,应该按照题目要求输出相关错误提示
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的分母为1,说明该分数是整数,题目要求可能会直接输出分子,省略分母的输出
(3)如果分数r的分子的绝对值大于分母,说明该分数是假分数,此时要按带分数的形式输出。整数部分r.up/r.down,分子部分abs(r.up)%r.down,分母部分r.down
(4)对分数进行乘法或除法时,需要考虑结果的分子和分母是否超出int范围,如果超出则要使用long long型存储分子和分母
*/
//输出分数
void showResult(Fraction r) {
r = reduction(r); //先化简
if (r.down == 1) printf("%d", r.up); //r是整数
else if (abs(r.up) > r.down) { //r是假分数
printf("%d %d/%d", r.up / r.down, abs(r.up) % r.down, r.down);
}
else { //r是真分数
printf("%d/%d", r.up, r.down);
}
}