注:水仙花數指的是每一個十進制位的立方加起來等於他自身的三位數,水仙花數本身就是三位數- -範圍100-999,可以遍歷來做
之前想的是每一位的數在1-9之間選,再通過每位分別乘以100,10,1轉化再與自身比較。
下面是遍歷100-999的數,看是否滿足水仙花數條件,輸出水仙花數
注意循環嵌套時一些變量初始值的改變,如這裏si,flag1【也許這裏不應該稱之爲變量,暫時這樣說吧】
做的時候這兩個值發生了改變導致不好找錯誤,然後發現兩次循環(包含一個水仙花數)可以正常輸出,三次及以上不行找到了這錯誤。
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">data segment
flag1 db 0
flag2 db 0
outt db 'shuixianhua: ','$'
array0 dw 3 dup(0)<span style="color:#33CC00;">;保存三位數的每一位的三次方</span>
data ends
stack segment
stack ends
code segment
assume cs:code,ds:data,ss:stack
begin: mov ax,data
mov ds,ax
lea dx,outt
mov ah,9
int 21h
mov cx,1000
x1: mov si,0<span style="color:#33CC00;">;同樣也是一直沒發現的錯誤,錯誤原因差不多</span>
dec cx <span style="color:#33CC00;">;用cx來計100-999的這1000個數</span>
mov ax,cx;
cmp ax,99
jz endd
<span style="color:#33CC00;">;************將這個三位數每一個十進制位算出併入棧保存********** </span>
x2: mov bx,10
xor dx,dx
div bx
push dx
cmp ax,0
jnz x2
mov flag1,3;<span style="color:#33CC00;">這裏錯誤一直沒有發現,之前直接把flag1定爲3以爲萬事大吉導致下面循環一次過後flag1值變爲0,所以說一定要注意變量值再下一次循環需不需要恢復到初始值。
;*************計算每位數的立方************ </span>
x3: pop ax
mov bx,ax
mul bl
mul bl
mov word ptr array0[si],ax
add si,2;***********小心別順手寫成inc si************
dec flag1
cmp flag1,0
jnz x3
;***********計算每位數立方的和************
sum: mov ax,array0[0]
mov bx,array0[2]
add ax,bx
mov bx,array0[4]
add ax,bx
cmp ax,cx<span style="color:#33CC00;">;這裏有兩個條件需要暫時終止這個循環一是出現了水仙花數而是三位數遍歷完了</span>
mov ax,cx
jnz x1 <span style="color:#33CC00;">;這兩個條件如果一起放在最後,處理有點麻煩所以把後面一個判斷放在最前面</span>
call output<span style="color:#33CC00;">;//////////////////////////////////////////////</span>
jmp x1
endd: mov ax,4c00h
int 21h
<span style="color:#33CC00;">;將水仙花數轉化爲10進制輸出,如果之前把每一位數保存在數組裏的話,可以不用這麼繁瑣,直接把之前計算的每一位輸出就好</span>
output: mov bx,10
xor dx,dx
div bx
push dx
inc flag2
cmp ax,0
jnz output
output0: pop dx
add dx,30h
mov ah,2
int 21h
dec flag2
cmp flag2,0
jnz output0
mov dx,' '
mov ah,2
int 21h
ret
code ends
end begin
</span></span>