80x86汇编语言编程:求 10000 以内的《完数》


一个数,如果恰好等于它的因子之和,这个数就称为“完数”。

例如 6 的因子为 1、2、3,而 6 = 1 + 2 + 3,因此 6 就是“完数”。


用 C 语言编程求完数,还是很容易的。

可见:http://zhidao.baidu.com/question/420702519.html


//编程找出1000以内的所有完数:


#include <stdio.h>

void main()

{

    int x, i, sum;

    x = 1;

    while(x <= 1000)  {       //x要从1到1000循环.

      sum = 0;                //每算一个新的x时,sum要清0

      for(i = 1; i < x; i++)  if(x % i == 0) sum += i; //如果i是x的因子,sum加上i

      if(x == sum)  printf("%d\n", x); //如果因子和等于本身.

      x++;

    }

}

//===================================================


但是,如果要求使用汇编语言来编程,求出 10000 以内的完数,就不那么简单了。


题目可见:

http://zhidao.baidu.com/question/489911508.html

http://zhidao.baidu.com/question/491149374.html


做而论道的回答如下:

;刚才,在另一个题目中,回答了,但是百度不给显示。

;在这里回答,希望百度能表现好一点。


;下列程序,可以输出10000以内的完数:


DATAREA SEGMENT

    x  DW  ?

    i  DW  ?

  sum  DW  ?

    

DATAREA ENDS

;------------------------------------

PROGNAM SEGMENT

    ASSUME CS:PROGNAM,DS:DATAREA

START:   

    MOV   AX, DATAREA

    MOV   DS, AX 


    MOV   x, 1     ;x: 1 ~ 10000

M_LOOP:

;------------------------------------

    MOV   sum, 0

    MOV   i, 1     ;i: 1 ~ x - 1

;----------------

M2_LOP:

    MOV   DX, 0

    MOV   AX, x

    MOV   BX, i

    DIV   BX

    CMP   DX, 0

    JNZ   NEXT

    ADD   sum, BX  ;

NEXT:

    INC   i

    MOV   AX, i

    CMP   AX, x

    JB    M2_LOP

;----------------

    MOV   AX, x

    CMP   AX, sum

    JNZ   NO

    CALL  DISP

NO: 

;------------------------------------

    INC   x

    CMP   x, 10000

    JNZ   M_LOOP

;------------------------------------

EXIT:

    MOV  AH, 4CH

    INT  21H

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

DISP:

    PUSH AX

    PUSH BX

    PUSH CX

    PUSH DX

;------------------------

    MOV  AX, sum

    MOV  BX, 10

    MOV  CX, 0

L1:

    MOV  DX, 0

    DIV  BX

    PUSH DX

    INC  CX

    AND  AX, AX

    JNZ  L1

L2:

    POP  DX

    ADD  DL, 48

    MOV  AH, 2

    INT  21H

    LOOP L2

;------------------------

    MOV  DL, 13

    MOV  AH, 2

    INT  21H

    MOV  DL, 10

    MOV  AH, 2

    INT  21H


    POP  DX

    POP  CX

    POP  BX

    POP  AX

    RET

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

PROGNAM ENDS

    END START


程序运行后,输出如下:


C:\MASM>WS

1

6

28

496

8128


C:\MASM>


《完》


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值