練手程式2006 9 7

2021-04-09 02:56:34 字數 3687 閱讀 6952

13:01 2006-9-7:昨天下午的時候跟jailu聊天的時候說了這個題:

從1到100,100個數字相加,和為100的演算法,可以1位,2位,3位等,不限位數相加,數字不能重複,可以有多少種演算法,並把**貼出;

可以這樣:

1 + 99;

2 + 98;

也可以這樣:

1 + 2 + 97;

更可以這樣:

1 + 2 + 3 + 5 + 7 + 82;

jailu說寫個彙編看看執行效率如何,於是我就寫,初時想了好久好久,都沒有什麼可行的方法,主要是心靜不下來,結果想到晚上還是沒有結果,於是今天早上去上自習,想了一會,加上昨天的一些思路,很快就出結果了。而且程式很短,鬱悶,jailu說他用了10min寫的,而我卻用了6~7 h

13:18 2006-9-7:目前執行結果正確:444792,耗時10ms,效率是jailu的100倍,因為區域性變數的使用,我的資料存放最多為:50*13*13*4=33800 b 約33k,而jailu的使用量:每個結果平均最少需要14個b的空間,也就是5個值4個加號,即共計最少占用14*444792=6mb!

fmt_result    db    '計算結果:共計:%d  計算耗時:%d ms',0

.data?

hinstance    dd    ?

tmpstr    db    128 dup    (?)

.code

;結果輸出

_sendtonotepad    proc    _lpsz

local    @hwinnotepad

invoke    findwindow,addr szdestclass,null

.if    eax

mov    ecx,eax

invoke    childwindowfrompoint,ecx,20,20

.endif

.if    eax

mov    @hwinnotepad,eax

mov    esi,_lpsz

@@:lodsb

or    al,al

jz    @f

movzx    eax,al

invoke    postmessage,@hwinnotepad,wm_char,eax,1

jmp    @b

@@:.endif

ret_sendtonotepad    endp

;eax=0 now為0

;my(num[1]...num[13],j);

;  if(num[j+1];    

;  cout++;

; };}

;my(1,99,0,0,0,0,0,2);

_cout    proc    @n,@n2,@n3,@n4,@n5,@n6,@n7,@n8,@n9,@n10,@n11,@n12,@n13,@i

mov    ecx,@i

mov    eax,@n[ecx]

mov    edx,@n[ecx-4]

sub    eax,edx

@@:    inc    edx

dec    eax

.if    eax <= edx

xor    eax,eax

ret.endif

mov    @n[ecx+4],eax

mov    @n[ecx],edx

inc    edi

;如果需要結果輸出的話,下面一段可用,但時間上很慢好像。

;    push    eax

;    pushad

;    invoke    wsprintf,addr tmpstr,addr fmt_my,@n,@n2,@n3,@n4,@n5,@n6,@n7,@n8,@n9,@n10,@n11,@n12,@n13

;    invoke    _sendtonotepad,addr tmpstr

;    popad

;    pop    eax

.if    ecx < 2ch

add    ecx,4

invoke    _cout,@n,@n2,@n3,@n4,@n5,@n6,@n7,@n8,@n9,@n10,@n11,@n12,@n13,ecx

.endif

mov    ecx,@i

mov    edx,@n[ecx]

mov    eax,@n[ecx+4]

jmp    @b

_cout endp

_main    proc

local    @num1

local    @num2

pushad

invoke    gettickcount

mov    ebx,eax        ;用ebx做時鐘計數

xor    edi,edi        ;用edi做計數器

push    1

pop    @num1

push    99

pop    @num2

.while    @num1 < 50

invoke    _cout,@num1,@num2,0,0,0,0,0,0,0,0,0,0,0,4

inc    edi

inc    @num1

dec    @num2

.endw

invoke    gettickcount

sub    eax,ebx

invoke    wsprintf,addr tmpstr,addr fmt_result,edi,eax

invoke    messagebox,null,addr tmpstr,null,mb_ok

popad

ret_main endp

start:

invoke    getmodulehandle,null

mov    hinstance,eax

invoke    _main

invoke    exitprocess,null

end start 

程式練手 Spring

獲取的proxyfactorybean不是那個proxyfactorybean而是它所 的內容。aspectj切面使用 aspect註解配置 用 aspect註解的類可以有方法和字段,他們也可能包括切入點 pointcut 通知 advice 和引入 introduction 宣告 aspect註解...

小程式練手(c )

給定乙個陣列input 如果陣列長度n為奇數,則將陣列中最大的元素放到 output 陣列最中間的位置,如果陣列長度n為偶數,則將陣列中最大的元素放到 output 陣列中間兩個位置偏右的那個位置上,然後再按從大到小的順序,依次在第乙個位置的兩邊,按照一左一右的順序,依次存放剩下的數。例如 inpu...

練手小程式(四)

這次的練手程式依然來自於knight lab的部落格文章five mini programming projects for the python beginner,任務的名字叫做textbased adventure game,也就是文字冒險遊戲 目標 我們的目標是完整的建立乙個文字小遊戲,這個小...