相等的有理数

相等的有理数

#include <string>
using namespace std;

class Solution {
public:
	using ll = long long;
	// 寻找n, m的最大公约数,辗转相除法 n<m
	ll gcd(ll n, ll m) {
		if (n > m) return gcd(m, n);
		if (n == 0 || m % n == 0) return n;
		return gcd(m % n, n);
	}
	// 化简分数 n / m
	void simplify(ll& n, ll& m) {

		if (n == 0 || m == 0) {
			n = 0;
			m = 1;
		}
		ll t = gcd(n, m);

		if (t > 0) {
			n /= t;
			m /= t;
		}
	}
	// 两分数相加 n1 / d1 + n2 / d2;
	pair<ll, ll> add(ll n1, ll d1, ll n2, ll d2) {
		ll n, d;

		if (d1 == 0) {
			n = n2;
			d = d2;
		}
		else if (d2 == 0) {
			n = n1;
			d = d1;
		}
		else {
			n = n1 * d2 + n2 * d1;
			d = d1 * d2;
		}
		simplify(n, d);

		return { n, d };//pair<int,int>
	}
	//转换成分数
	pair<int, int> trans(string S) {

		ll int_part = 0;
		ll nonrep_part = 0;
		ll rep_part = 0;

		ll nonrep_len = 0;
		ll rep_len = 0;

		int i = 0;
		int N = S.size();
		
		while (i < N && S[i] != '.') {
			int_part = int_part * 10 + S[i] - '0';//S[i] - '0' 字符转换为数值
			++i;
		}
		++i;//跳过 '.'
		while (i < N && S[i] != '(') {
			nonrep_part = nonrep_part * 10 + S[i] - '0';
			++nonrep_len;
			++i;
		}
		++i;//跳过 '('
		while (i < N && S[i] != ')') {
			rep_part = rep_part * 10 + S[i] - '0';
			++rep_len;
			++i;
		}

		ll p1 = pow(10, nonrep_len);
		ll p2 = pow(10, rep_len);
		ll p3 = p1 * p2;

		// 非重复小数部分的分子与分母:转化为frac/100
		ll nonrep_num = nonrep_part;
		ll nonrep_dom = p1;
		// 重复小数部分的分子与分母:x/100+x/10000+......
		ll rep_num = rep_part * p2;
		ll rep_dom = p3 * (p2 - 1);

		simplify(nonrep_num, nonrep_dom);
		simplify(rep_num, rep_dom);

		auto p = add(nonrep_num, nonrep_dom, rep_num, rep_dom);

		return add(p.first, p.second, int_part, 1LL);
	}

	bool isRationalEqual(string S, string T) {
		return trans(S) == trans(T);
	}
};

有理数

以下是两个有理数运算符重载的例子: ```python class Rational: def __init__(self, numerator, denominator): if denominator == 0: raise ZeroDivisionError("分母不能为0") self.numerator = numerator self.denominator = denominator self._simplify() def _simplify(self): gcd_num = self._gcd(self.numerator, self.denominator) self.numerator //= gcd_num self.denominator //= gcd_num def _gcd(self, a, b): if b == 0: return a return self._gcd(b, a % b) def __add__(self, other): new_numerator = self.numerator * other.denominator + self.denominator * other.numerator new_denominator = self.denominator * other.denominator return Rational(new_numerator, new_denominator) def __sub__(self, other): new_numerator = self.numerator * other.denominator - self.denominator * other.numerator new_denominator = self.denominator * other.denominator return Rational(new_numerator, new_denominator) def __mul__(self, other): new_numerator = self.numerator * other.numerator new_denominator = self.denominator * other.denominator return Rational(new_numerator, new_denominator) def __truediv__(self, other): new_numerator = self.numerator * other.denominator new_denominator = self.denominator * other.numerator return Rational(new_numerator, new_denominator) def __eq__(self, other): return self.numerator == other.numerator and self.denominator == other.denominator def __str__(self): return str(self.numerator) + '/' + str(self.denominator) ``` 上述代码中,我们定义了一个有理数类Rational,其中包含了分子和分母两个整数成员变量,以及初始化函数、化简函数、加减乘除和相等判断等运算符重载函数。在加减乘除函数中,我们分别计算了新的分子和分母,并返回一个新的有理数对象。在相等判断函数中,我们判断了两个有理数的分子和分母是否相等。最后,我们还定义了一个__str__函数,用于将有理数对象转换为字符串输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值