题目:
简化的歌德巴赫猜想:任何一个大于6的偶数均可以表示为两个素数之和。现从键盘输入一个0~65535之间的无符号整数,试验证歌德巴赫猜想。
如输入数12,输出:
12=5+7
如输入数20,输出:
20=3+17
20=7+13
如输入数7,输出:
Must be even
如输入数3,输出:
Must be greater than or equal to 6
DATAS SEGMENT
x dw ?
string1 db 'Must be even',0dh,0ah,24h
string2 db 'Must be greater than or equal 6',0dh,0ah,24h
crlf db 0dh,0ah,24h
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov bx,0
newChar: ;十进制输入
mov ah,1
int 21h
sub al,30h
jl next
cmp al,9
jg next
cbw
xchg ax,bx
mov cx,10
mul cx
xchg ax,bx
add bx,ax
jmp newChar
next:
cmp bx,6
jl lessNum
test bx,01h
jnz oddNum
mov x,bx
mov ax,bx
cwd
mov cx,2
div cx ;ax=商,即x/2
mov di,ax ;di=(x/2), 3 <= cx <= di
nextNum:
inc cx
mov bx,cx
call prime
cmp bx,0
jnz A10
cmp cx,di
jge last
jmp nextNum
A10:
mov bx,x
sub bx,cx
call prime
cmp bx,0
jnz display
cmp cx,di
jge last
jmp nextNum
display:
mov ax,x
call BintoDeci
mov dl,'='
mov ah,2
int 21h
mov ax,cx
call BintoDeci
mov dl,'+'
mov ah,2
int 21h
mov ax,x
sub ax,cx
call BintoDeci
lea dx,crlf
mov ah,9
int 21h
cmp cx,di
jge last
jmp nextNum
lessNum:
lea dx,string2
mov ah,9
int 21h
jmp last
oddNum:
lea dx,string1
mov ah,9
int 21h
jmp last
BintoDeci proc near
push si
push cx
push dx
mov si,10
mov cx,0
rotate:
xor dx,dx
div si
push dx
inc cx
cmp ax,0
jnz rotate
output:
pop dx
mov ah,2
add dl,30h
int 21h
loop output
pop dx
pop cx
pop si
ret
BintoDeci endp
;bx中存储着待判断的数,如果是素数,bx=1;否则bx=0
prime proc near
push si
push cx
mov si,2
mov cx,bx
dec cx
A20:
mov ax,bx
cwd
div si
cmp dx,0
jz notPrime
inc si
cmp si,cx
jle A20
mov bx,1
jmp exit
notPrime:
mov bx,0
exit:
pop cx
pop si
ret
prime endp
last:
MOV AH,4CH
INT 21H
CODES ENDS
END START