8086 彙編 尋找並輸出水仙花數

注:水仙花數指的是每一個十進制位的立方加起來等於他自身的三位數,水仙花數本身就是三位數- -範圍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>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章