給你一個正整數 i ,請你寫一個程式找出在數列 S1 S2 S3...Sk中第 i 個位置的字元是多少。其中Sk包含從 1 到 k的數字,一個接著一個。例如 S3=123、S11=1234567891011。
例如:S1 S2 S3...的前80個字元如下所示:
112123123412345123456123456712345678123456789123456789101234567891
輸出=>1
以下是我寫的程式,但是只要數字很大就會跑很久,請各位大大幫我想想要怎麼讓他跑得快一點,拜託~~~
Private Sub Command1_Click()
Open App.Path & "\\in.txt" For Input As #1
Open App.Path & "\\out.txt" For Output As #2
Input #1, a
For i = 1 To a
Input #1, n
j = "1"
strr = ""
k = 1
Do
strr = strr & j
k = k + 1
j = j & Trim(k)
Loop While Len(strr) < n
Print #2, Mid(strr, n, 1)
Next i
Close
End Sub
2006-09-08 03:50:41 · 2 個解答 · 發問者 以晴 2 in 電腦與網際網路 ➔ 程式設計
各位大大,小的我在此佩服諸位的聰明才智
以下有幾點我之前忘記說明,所以就在此補充一下:
1)這是一個用檔案做輸入輸出的題目,輸入檔的第一行代表總共有a筆測試資料
2)測試資料當中僅輸入i值,k值是在程式執行時利用程式計算出來的
3)在老師給我的測試資料當中,有好幾筆的i值大於一萬甚至有超過十億的數值,但是他要求必須在30秒之內執行完畢!
2006-09-11 15:39:45 · update #1
Private Sub Command1_Click() Dim I%, J%, K%, S$ Do K = Int(Val(InputBox("請輸入K值", , 10))) Loop Until K > 0 For I = 1 To K For J = 1 To I S = S & J Next Next Do K = Int(Val(InputBox("請輸入I值,I範圍:1~" & Len(S)))) Loop Until K > 1 Print Mid$(S, K, 1)End Sub
2006-09-13 16:44:52 補充:
Dim S$, K#, H#, N#, T#, J#, I%Open App.Path & ”\in.txt” For Input As #1Open App.Path & ”\out2.txt”For Output As #2Input #1, AFor I = 1 To A Input #1, N T = 0: H = 0: K = N For J = 1 To N S = J T = T + H + Len(S) If K = T Then
2006-09-13 16:51:20 補充:
Print #2, Left(S, 1): Exit For ElseIf K < T Then K = T - K + 1 Do If K > Len(S) Then K = K - Len(S): S = S - 1 Else
2006-09-13 16:52:14 補充:
Print #2, Mid(S, Len(S) - K + 1, 1): Exit For End If Loop End If H = H + Len(S) NextNextClose
2006-09-13 17:11:26 補充:
臭知識+,好難補充XD,如果上面補充看不懂就到以下網址下載吧(只能放7天),一千億數跑起來只須1~2秒.http://www.yousendit.com/transfer.php?action=check_download&ufid=2FE9151F105BD210&key=75610130f1f4de80274d25b1967de8098ff3b73c
2006-09-08 07:48:08 · answer #1 · answered by W.J.S. 7 · 0⤊ 0⤋
先將你的程式分成3個部分來看,由於你的資料Strr的值一直都是一樣,因此先求得資料中最大值,在將最大值的Strr求出,最後在跑一次迴圈就完成了
1求資料中最大值
2輸出最大值Max的文字段產出Strr
3跑一個迴圈輸出結果
程式碼如下
Private Sub Command1_Click()
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
t = Timer: Max = 0
1求資料中最大值,將這行拿掉才能執行
Input #1, a
For i = 1 To a
Input #1, n
If n > Max Then Max = n
Next i
2輸出最大值Max的文字段產出Strr,將這行拿掉才能執行
strr = "": k = 1: j = "1"
Do
strr = strr & j: k = k + 1: j = j & Trim(k)
Loop While Len(strr) < Max
3跑一個迴圈輸出結果,將這行拿掉才能執行
Close #1: Open "C:\in.txt" For Input As #1
Input #1, n
For i = 1 To a
Input #1, n
Print #2, Mid(strr, n, 1)
Next i
Print #2, Timer - t
Close #2
Close #1
Beep
End Sub
這樣修改好之後速度會加快約為400倍左右
' 以上請修改
"=”
<=<
2006-09-10 10:02:37 · answer #2 · answered by ㄚ旺 5 · 0⤊ 0⤋