求最大公约数
汇编语言求最大公约数
本想采用辗除法,但是考虑到汇编语言似乎没有取模运算
故采取的算法为更相减损术:、
两个正整数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++来写还好,但是要我用汇编语言,就超出我目前的水平了,故不多做赘述。