关于Rational类的约分

关于Rational类的约分

问题描述:

老师好!
我的理解这里约分其实就是求分子和分母的最大公约数,然后让分子分母同除最大公约数即可。经典的数论问题了,用辗转相除法可以求出最大公约数。
如果还有其它方法,或者更工程化的方法,还请老师批评指正~

相关代码:

int gcd(int x, int y) {
    return y ? gcd(y, x%y) : x;
}

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

是的。这里可以使用求最大公约数的方法进行约分。求最大公约数最简单的方式就是使用欧几里得的辗转相除法。但是你这里的gcd有几个明显的缺陷:首先这里一般来说x是需要大于y的,你没有做判断;再者这里的x%y效率比较低,可以有优化算法;并且使用递归来实现这个有天然的缺陷,递归层数不能太深。这方面有待修正和优化。加油。

  • 李谌 提问者 #1

    谢谢老师~

    老师说的取余效率较低,我查询了一些资料。其中提到,“求余虽然只有一条指令但这条指令要耗费100多个周期。”因此,将 a % b 操作转换为 a - a / b * b是个通用的优化做法。老师说的优化是指这个吗?

    2023-06-20 09:46:34
  • quickzhao 回复 提问者 李谌 #2

    你这样的优化也仅仅停留在工程角度。其实算法优化需要首先从数学角度考虑,最大公约数有性质(a,b) = (a-b, b)   其中(a >b,a、b为正整数),所以你其实可以可以使用这个特性将最大公约数的运算规模不断减小,这样既不会使用同余也不会使用乘除法,效果高很多。当然了,从工程的角度来看其实乘除法也有办法优化,至少你可以采用移位运算这样的位运算,代替你的乘除法,效率更高些。

    2023-06-20 10:08:31
  • 李谌 提问者 回复 quickzhao #3

    谢谢老师!

    2023-06-20 11:44:24
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
C++中高级工程师
  • 参与学习       113    人

无论你在哪个C++领域,越早提升高阶能力,职业发展越好 以工程实践驱动教学,全方位提升“内功,思维,设计,技术”能力 简历指导+1V1答疑+直播答疑等专属服务保障,学习无忧

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师