分数的四则运算

点击查看代码
#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);
	}
}

posted @ 2022-09-28 22:47  zhaoo_o  阅读(319)  评论(0编辑  收藏  举报