English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

給你一個正整數 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

2 個解答

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

fedest.com, questions and answers