一个数,如果恰好等于它的因子之和,这个数就称为“完数”。
例如 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>
《完》