分数的加减乘除


前言

本文代码模板来自《算法笔记》,书籍如下图所示:
在这里插入图片描述


一、分数的表示与化简

1.分数的表示

对于一个分式,我们把它写成假分式的形式

struct Fraction{		 //分数
	int up, down;        //分子,分母
};

我们对于一个分数,制定三项规则:① 保证down(分母)为非负数,如果一个分数是负数,我们要求它的分子为负;② 如果分数为0,令up为0, down为1;③ 分子和分母没有除了1以外的公约数。

2.分数的化简

针对于我们对分数的三种定义,我们在分数的化简时对应的三个步骤:① 如果分母为负数,那么令分子和分母都变成负数;② 如果分子up为0,那么令分母down为1;③ 约分:求出分子的绝对值和分母的绝对值的最大公约数d,然后分子分母同时除以d.

代码为

Fraction reduction (Fraction result)
{
	if (result.down < 0)
	{
		result.up = - result.up;
		result.down = - result.down;
	}
	if (result.up == 0) result.down = 1;
	else
	{
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}

关于gcd函数在这篇博客有详细解释:(先鸽),这里给出代码

int gcd(int a, int b)
{
	if (b == 0) return a;
	else return gcd(b, a % b);
}

二、分数的四则运算

1.分数的加法:

对于两个分数f1,f2的加法,计算公式为:

在这里插入图片描述

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map> 

using namespace std;

int gcd(int a, int b)
{
	if (b == 0) return a;
	else return gcd(b, a % b);
}

struct Fraction
{
	int up, down;	
};

Fraction reduction (Fraction result)
{
	if (result.down < 0)
	{
		result.up = - result.up;
		result.down = - result.down;
	}
	if (result.up == 0) result.down = 1;
	else
	{
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}

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);
}

void showResult (Fraction r)
{
	r = reduction(r);
	if (r.down == 1) printf("%d", r.up);
	else if (abs(r.up) > r.down)
		printf("%d %d/%d", r.up / r.down, abs(r.up) % r.down, r.down);
	else printf("%d/%d", r.up, r.down);
}

int main()
{
	Fraction f1, f2;
	scanf("%d%d", &f1.up, &f1.down);
	scanf("%d%d", &f2.up, &f2.down);
	Fraction res = add(f1, f2);
	showResult(res);
	return 0;
}

2.分数的减法

对于两个分数f1,f2的减法,计算公式为:

在这里插入图片描述

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map> 

using namespace std;

int gcd(int a, int b)
{
	if (b == 0) return a;
	else return gcd(b, a % b);
}

struct Fraction
{
	int up, down;	
};

Fraction reduction (Fraction result)
{
	if (result.down < 0)
	{
		result.up = - result.up;
		result.down = - result.down;
	}
	if (result.up == 0) result.down = 1;
	else
	{
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}

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);
}

void showResult (Fraction r)
{
	r = reduction(r);
	if (r.down == 1) printf("%d", r.up);
	else if (abs(r.up) > r.down)
		printf("%d %d/%d", r.up / r.down, abs(r.up) % r.down, r.down);
	else printf("%d/%d", r.up, r.down);
}

int main()
{
	Fraction f1, f2;
	scanf("%d%d", &f1.up, &f1.down);
	scanf("%d%d", &f2.up, &f2.down);
	Fraction res = minu(f1, f2);
	showResult(res);	
	return 0;
}

3.分数的乘法

对于两个分数f1,f2的乘法,计算公式为:

在这里插入图片描述

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map> 

using namespace std;

int gcd(int a, int b)
{
	if (b == 0) return a;
	else return gcd(b, a % b);
}

struct Fraction
{
	int up, down;	
};

Fraction reduction (Fraction result)
{
	if (result.down < 0)
	{
		result.up = - result.up;
		result.down = - result.down;
	}
	if (result.up == 0) result.down = 1;
	else
	{
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}

Fraction multi(Fraction f1, Fraction f2)
{
	Fraction result;
	result.up = f1.up * f2.up;
	result.down = f1.down * f2.down;
	return reduction(result);
}

void showResult (Fraction r)
{
	r = reduction(r);
	if (r.down == 1) printf("%d", r.up);
	else if (abs(r.up) > r.down)
		printf("%d %d/%d", r.up / r.down, abs(r.up) % r.down, r.down);
	else printf("%d/%d", r.up, r.down);
}

int main()
{
	Fraction f1, f2;
	scanf("%d%d", &f1.up, &f1.down);
	scanf("%d%d", &f2.up, &f2.down);
	Fraction res = multi(f1, f2);
	showResult(res);
	return 0;
}

4.分数的除法

对于两个分数f1,f2的除法,计算公式为:

在这里插入图片描述

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map> 

using namespace std;

int gcd(int a, int b)
{
	if (b == 0) return a;
	else return gcd(b, a % b);
}

struct Fraction
{
	int up, down;	
};

Fraction reduction (Fraction result)
{
	if (result.down < 0)
	{
		result.up = - result.up;
		result.down = - result.down;
	}
	if (result.up == 0) result.down = 1;
	else
	{
		int d = gcd(abs(result.up), abs(result.down));
		result.up /= d;
		result.down /= d;
	}
	return result;
}

Fraction divide(Fraction f1, Fraction f2)
{
	Fraction result;
	result.up = f1.up * f2.down;
	result.down = f1.down * f2.up;
	return reduction(result);
}

void showResult (Fraction r)
{
	r = reduction(r);
	if (r.down == 1) printf("%d", r.up);
	else if (abs(r.up) > r.down)
		printf("%d %d/%d", r.up / r.down, abs(r.up) % r.down, r.down);
	else printf("%d/%d", r.up, r.down);
}

int main()
{
	Fraction f1, f2;
	scanf("%d%d", &f1.up, &f1.down);
	scanf("%d%d", &f2.up, &f2.down);
	Fraction res = divide(f1, f2);
	showResult(res);
	return 0;
}
下面是Java实现假分数加减乘除运算的示例代码: ```java public class Fraction { private int numerator; // 分子 private int denominator; // 分母 public Fraction(int numerator, int denominator) { this.numerator = numerator; this.denominator = denominator; } // 获取分子 public int getNumerator() { return numerator; } // 获取分母 public int getDenominator() { return denominator; } // 转化为假分数 public Fraction toImproperFraction() { int newNumerator = numerator + denominator * (numerator < 0 ? -1 : 1); return new Fraction(newNumerator, denominator); } // 加法 public static Fraction add(Fraction f1, Fraction f2) { int newNumerator = f1.getNumerator() * f2.getDenominator() + f2.getNumerator() * f1.getDenominator(); int newDenominator = f1.getDenominator() * f2.getDenominator(); return new Fraction(newNumerator, newDenominator).toImproperFraction(); } // 减法 public static Fraction subtract(Fraction f1, Fraction f2) { int newNumerator = f1.getNumerator() * f2.getDenominator() - f2.getNumerator() * f1.getDenominator(); int newDenominator = f1.getDenominator() * f2.getDenominator(); return new Fraction(newNumerator, newDenominator).toImproperFraction(); } // 乘法 public static Fraction multiply(Fraction f1, Fraction f2) { int newNumerator = f1.getNumerator() * f2.getNumerator(); int newDenominator = f1.getDenominator() * f2.getDenominator(); return new Fraction(newNumerator, newDenominator).toImproperFraction(); } // 除法 public static Fraction divide(Fraction f1, Fraction f2) { int newNumerator = f1.getNumerator() * f2.getDenominator(); int newDenominator = f1.getDenominator() * f2.getNumerator(); return new Fraction(newNumerator, newDenominator).toImproperFraction(); } // 输出假分数 public String toString() { int integerPart = numerator / denominator; int newNumerator = numerator % denominator; if (newNumerator == 0) { return String.valueOf(integerPart); } return integerPart + " " + newNumerator + "/" + denominator; } } ``` 接下来是一个简单的测试: ```java public class Main { public static void main(String[] args) { Fraction f1 = new Fraction(3, 4); Fraction f2 = new Fraction(1, 2); Fraction sum = Fraction.add(f1, f2); Fraction difference = Fraction.subtract(f1, f2); Fraction product = Fraction.multiply(f1, f2); Fraction quotient = Fraction.divide(f1, f2); System.out.println(f1 + " + " + f2 + " = " + sum); System.out.println(f1 + " - " + f2 + " = " + difference); System.out.println(f1 + " * " + f2 + " = " + product); System.out.println(f1 + " / " + f2 + " = " + quotient); } } ``` 输出结果应该为: ``` 3/4 + 1/2 = 5/4 3/4 - 1/2 = 1/4 3/4 * 1/2 = 3/8 3/4 / 1/2 = 3/2 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值