80x86 汇编:用辗转相除法求两个数的最大公约数

来源:互联网 发布:多瑞科舆情数据分析站 编辑:程序博客网 时间:2024/06/02 02:24

;用辗转相除法求两个数的最大公约数

;对两个无符号字变量进行初始化,用辗转相除法求他们的最大公约数,
;将结果保存到字变量result中。

;http://zhidao.baidu.com/question/426407800681153052.html

;做而论道编程如下:

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。

;========================================


0 0
原创粉丝点击