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,也就是文字冒險遊戲 目標 我們的目標是完整的建立乙個文字小遊戲,這個小...