;用辗转相除法求两个数的最大公约数
;对两个无符号字变量进行初始化,用辗转相除法求他们的最大公约数,
;将结果保存到字变量result中。
;做而论道编程如下:
DATA SEGMENT
A DW 15750 ;0~65535
B DW 27216 ;0~65535
RESULT DW ?
CRLF DB 0AH, 0DH, '$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, A
CALL DISP
LEA DX, CRLF
MOV AH, 9
INT 21H
MOV AX, B
CALL DISP
LEA DX, CRLF
MOV AH, 9
INT 21H
CALL ZHANZHAUN
MOV AX, RESULT
CALL DISP
EXIT:
MOV AH, 4CH
INT 21H
;---------------------------
ZHANZHAUN PROC NEAR ;辗转相除
MOV AX, A
MOV BX, B
CMP AX, BX
JNB Z_1
MOV B, AX
MOV A, BX
Z_1:MOV AX, A
MOV BX, B
MOV DX, 0
DIV BX
CMP DX, 0
JE Z_E
MOV AX, B
MOV A, AX
MOV B, DX
JMP Z_1
Z_E:MOV RESULT, BX
RET
ZHANZHAUN ENDP
;---------------------------
DISP PROC NEAR
MOV BX, 10
MOV CX, 0
DI1:MOV DX, 0
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNZ DI1
MOV AH, 2
DI2:POP DX
ADD DL, '0'
INT 21H
LOOP DI2
RET
DISP ENDP
;---------------------------
CODE ENDS
END START
;========================================
题目,虽然没有要求显示,但是做而论道也编写了显示的功能部分。
程序执行后,可以显示出来:
15750
27216
126
其中的 126,就是 15750、27216 的最大公约数。
;========================================
用辗转相除法来求两个数最大公约数,人工操作的步骤是:
有两个数字,一般来说,一个大,一个小。
用大数除以小数,然后,首先要看余数。
余数如果为零,那么,商,就是原来两个数的最大公约数。
余数如果不为零,就用余数当作小数,原来的小数当作大数,
再重复做除法的操作。
本操作方法正确性的证明,请参考其它资料。
例如,求 5750 与 27216 的最大公约数。
辗转相除的步骤如下:
27216 / 15750 = 1 ... 11466
15750 / 11466 = 1 ... 4284
11466 / 4284 = 2 ... 2898
4284 / 2898 = 1 ... 1386
2898 / 1386 = 2 ... 126
1386 / 126 = 11... 0
所以,15750 和 27216 的最大公约数就是 126。
;========================================