編一函式fun(int num)用於判斷整數num是否是水仙花數。所謂「水仙花數」是指乙個3位數,其各位數字立方和等於該數本身,如153=13+53+33。
執行後輸入:
153則結果輸出:
是水仙花數
執行後輸入:
123則結果輸出:
不是水仙花數
請在;【/和;】/之間編寫程式。
/源程式asm/
.386 ;選擇的處理器
.model flat, stdcall ;儲存模型,win32程式只能用平展(flat)模型
option casemap:none ;指明識別符號大小寫敏感
include kernel32.inc ;要引用的標頭檔案
includelib kernel32.lib ;要引用的庫檔案
includelib msvcrt.lib ;引用c庫檔案
scanf proto c:dword,:vararg ;c語言scanf函式原型宣告
printf proto c:dword,:vararg ;c語言printf函式原型宣告
.data ;⑤資料段
fmt byte 『%d』,0 ;定義變數
fmt2 byte 『%s』,0 ;定義變數
number dword 0
s1 byte 『是水仙花數』,0
s2 byte 『不是水仙花數』,0
.code ;⑥**段
;【/;】/
start: ;定義標號start
invoke scanf,addr fmt,addr number ;輸入number的值
invoke fun,number
invoke exitprocess,0 ;退出程序,返回值為0
end start ;指明程式入口點start
本人在此之前已經完成
**如下:
fun proc n:dword
local x:dword,y:dword
mov esi,n ;153
mov x,10
mov ecx,0
.while esi!=0
mov eax,esi
cdqmov esi,eax ;15 1
mov y,edx ;3 5 1
mov eax,y
mul y
mul y
add ecx,eax
.endw
.if ecx==n ;是水仙花數
invoke printf ,addr s1
.else
invoke printf ,addr s2
.endif
retfun endp
於是同學問我 為什麼他的**不對…
**如下:
fun proc x:dword
mov ebx,0
mov ecx,10
mov eax,x
.while eax!=0
cdqdiv ecx
mov edi,eax
mov eax,edx
mul edx
mul edx
add ebx,eax
mov eax,edi
.endw
.if ebx == x
invoke printf,addr fmt2,addr s1
.else
invoke printf,addr fmt2,addr s2
.endif
retfun endp
我找的錯誤是暫存器轉移時內容轉移時出現問題。
下面是我發現問題後的幾個疑問。
希望有大佬幫忙解答:
1.為什麼單純輸出乙個暫存器時內容正常而兩個暫存器內容都輸出時edx的值好像變成了位址?
如下圖:
2.後續的輸出eax值中在第乙個mul edx 還能輸出值來,後面的輸出又變成位址了???
終究還是實力不夠。
invoke printf,addr fmt,eax
至於暫存器錯誤原理不懂得如何解決。但是在同學**的基礎上加了兩個定義的 p,q 來儲存 除數和餘數是可以成功的解決問題的。
**如下:
fun proc x:dword
local p:dword ,q:dword
mov ebx,0
mov ecx,10
mov eax,x
.while eax != 0
cdqdiv ecx
mov p,eax
mov q,edx
mov eax,q
mul q
mul q
add ebx,eax
mov eax,p
.endw
.if ebx == x
invoke printf,addr fmt2,addr s1
.else
invoke printf,addr fmt2,addr s2
.endif
retfun endp
檢視其它大佬解題**:
.386 ;選擇的處理器
.model flat, stdcall ;儲存模型,win32程式只能用平展(flat)模型
option casemap:none ;指明識別符號大小寫敏感
include kernel32.inc ;要引用的標頭檔案
includelib kernel32.lib ;要引用的庫檔案
includelib msvcrt.lib ;引用c庫檔案
scanf proto c:dword,:vararg ;c語言scanf函式原型宣告
printf proto c:dword,:vararg ;c語言printf函式原型宣告
.data ;⑤資料段
fmt byte '%d',0 ;定義變數
fmt2 byte '%s',0 ;定義變數
n dword 0
s1 byte '是水仙花數',0
s2 byte '不是水仙花數',0
.code ;⑥**段
;*【*/
fun proc x:dword
mov ebx,0
mov ecx,10
mov eax,x
.while eax!=0
cdqidiv ecx
mov edi,eax
mov eax,edx
imul eax,edx
imul eax,edx
add ebx,eax
mov eax,edi
.endw
.if ebx==x
invoke printf,addr fmt2,addr s1
.else
invoke printf,addr fmt2,addr s2
.endif
retfun endp
;*】*/
start: ;定義標號start
invoke scanf,addr fmt,addr n ;輸入n的值
invoke fun,n
invoke exitprocess,0 ;退出程序,返回值為0
end start ;指明程式入口點start
感覺跟我同學的**相差不大 就是找不出錯誤原因…
小白求解!
水仙花問題
題目 輸出所有的 水仙花數 1.水仙花數是乙個三位數 2.水仙花數的個位 十位 百位的數字立方和等於原數。分析 運用for迴圈遍歷所有的三位數,三位數從100開始,到999結束 for int i 100 i 999 i 取出三位數中的個位十位百位數字 int a 數的個位 int b 數的十位 i...
關於水仙花數
前幾天看到有人去面試,筆試要求寫出列印水仙花數 這裡先解釋下什麼是水仙花數,以153為例,153 1的三次方 5的三次方 3的三次方。也就是所謂的水仙花數是指乙個三位數,其各位數字立方和等於該數本身。那麼,我們先來看 public static void main string args 其中,x ...
關於水仙花數問題 python
這個問題本身並不難,從題目中已經得知判斷的標準是 滿足方程abc a 3 b 3 c 3即可,所以解決問題的關鍵是將乙個三位數的百位,十位,個位的數分離出來,具體的辦法已在 中給出。編寫乙個程式,求 100 999 之間的所有水仙花數。如果乙個 3 位數等於其各位數字的立方和,則稱這個數為水仙花數。...