ARM汇编语言——循环

求最大公约数

汇编语言求最大公约数

本想采用辗除法,但是考虑到汇编语言似乎没有取模运算

故采取的算法为更相减损术:、

两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。比如10和25,25减去10的差是15,那么10和25的最大公约数,等同于10和15的最大公约数。

我们先计算出a和b的差值c(假设a>b),把问题转化成求出b和c的最大公约数;然后计算出c和b的差值d(假设c>b),把问题转化成求出b和d的最大公约数;再然后计算出b和d的差值e(假设b>d),把问题转化成求出d和e的最大公约数......

以此类推,逐渐把两个较大整数之间的运算简化成两个较小整数之间的运算,直到两个数可以相等为止,最大公约数就是最终相等的两个数。(此段注解转载自知乎:漫画算法:辗转相除法是什么鬼? - 知乎 (zhihu.com)

文章里有更加详尽的解释还有更先进的算法) 

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。——《九章算术》

 代码也简单

.text
.global _start
	
_start:
	mov r0, #9
	mov r1, #15
	loop:
		cmp r0,r1
		beq stop
		subcc r1,r1,r0
		subhi r0,r0,r1
	b loop
				
stop:
	b stop
.end
	

但是,相更减损术是不稳定的算法,当两数差聚悬殊时,如100000和1,则需要循环99999次

还有更快的算法——把相更减损术与位运算结合,但是,这个用C语言或C++来写还好,但是要我用汇编语言,就超出我目前的水平了,故不多做赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老K殿下

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

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

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

打赏作者

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

抵扣说明:

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

余额充值