section .text
global gcdmem
gcdmem:
push ebp ;把ebp压入堆栈,是为了保存ebp
mov ebp,esp ;栈底变栈顶
sub esp,8 ;开辟新的堆栈段,保存局部变量
mov eax,[ebp+8] ;x->[ebp-4]
mov [ebp-4],eax
mov eax,[ebp+12] ;y->[ebp-8]
mov [ebp-8],eax
looptop:
mov eax,[ebp-4]
cmp eax,0
je goback
mov ebx,[ebp-8]
cmp eax,ebx
jge modulo
mov [ebp-4],ebx
mov [ebp-8],eax
modulo:
mov ebx,[ebp-8]
mov eax,[ebp-4]
cdq
idiv ebx
mov [ebp-4],edx
jmp looptop
goback:
mov eax,[ebp-8]
add esp,8
pop ebp
ret
用C写翻译一下就是(增加了函数调用及测试)
#include<stdio.h>
void exchange(int *x,int *y)
{
int buf;
buf=*x;
*x=*y;
*y=buf;
}
int gcdmem(int x,int y)
{
while (x!=0)
{
if (x<y || y==0)
{
exchange(&x,&y);
}
x=x%y;
}
return y;
}
int main()
{
printf("%d and %d have a gcd: %d/n",50,20,gcdmem(50,20));
printf("%d and %d have a gcd: %d/n",38,28,gcdmem(38,28));
printf("%d and %d have a gcd: %d/n",135680,4256,gcdmem(135680,4256));
return 0;
}
///
就拿第二个测试gcdmem(38,28))说吧
1、38除以28,得到余数10
2、28除以10,得到余数8
3、10除以8,得到余数2
4、8除以2,余数为0,得到GCD(最大公约数) 2
=============
总的说来就是:
总是用较大数除以较小数,
第一次是用原有的x,y
接下来就是用上次相除时的较小数除以上次的余数
直到余数为0时,得到GCD为上次的余数
最大公约数算法
最新推荐文章于 2024-10-15 19:28:18 发布