2011年12月26日 星期一

第一次儲備選手選拔試卷第三題

計算二數成績的數字個數:從指定目錄"in.txt"讀取二個四位數正整數,相乘的積,計算該數字0到9的數字個數,輸出至指定目錄"out.txt"。
如1255*2100=2635500,結果有0有2個,2有1個,3有1個,5有2個,6有1個。其他個有0個,不用顯示。

輸入範例:1255 2100

輸出範例:02 21 31 52 61

8 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Dim a, x, n, c, e(99) As Long
    Dim d(99) As String
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    Input #1, x, n

    a = x * n
    c = Len(a)

    For i = 1 To c
    d(i) = Mid(a, i, 1)
    Next

    For i = 0 To 9
    For y = 0 To 9
    If d(i) = y Then e(y) = e(y) + 1
    Next
    Next

    For i = 0 To 9
    If e(i) = 0 Then
    Else
    Print #2, i & e(i),
    End If
    Next

    Close
    Close
    End
    End Sub

    回覆刪除
  2. 小冰好,程式有小錯誤

    1.你程式做了"太多"不必要的事情
    2.直接定義陣列(99) 不是個好習慣
    3.你 For i = 0 To 9 如果 a 長度大於9呢?
    4.陣列e()其實只需要宣告e(9)

    尤其是第一點,太多地方可以改進囉

    回覆刪除
  3. 感覺想的太少 程式做出來都有瑕疵
    還得了解的更深入

    Private Sub Form_Load()
    Me.Hide
    Dim a, x, n, c, e(9) As Long
    Dim d(99) As String
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    Input #1, x, n

    a = x * n
    c = Len(a)

    For i = 1 To c
    d(i) = Mid(a, i, 1)
    Next

    For i = 0 To c
    For y = 0 To 9
    If d(i) = y Then e(y) = e(y) + 1
    Next
    Next

    For i = 0 To 9
    If e(i) = 0 Then
    Else
    Print #2, i & e(i),
    End If
    Next

    Close
    Close
    End
    End Sub

    回覆刪除
  4. 勉強算可以了
    現在先不求速度,想清楚再做吧

    這個假日就想要怎樣用一個迴圈完成它吧

    回覆刪除
  5. 一個迴圈 是這個意思嗎= =?
    一個雙層迴圈

    Private Sub Form_Load()
    Me.Hide
    Dim a, x, n, c, e(10) As Long
    Dim d(99) As String
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    Input #1, x, n
    a = x * n
    c = Len(a)

    For i = 1 To c
    For y = 0 To 9
    d(i) = Mid(a, i, 1)
    If d(i) = y Then e(y) = e(y) + 1
    If i = c Then
    If e(y) <> 0 Then Print #2, y & e(y) & " ";
    End If
    Next
    Next

    Close
    Close
    End
    End Sub

    回覆刪除
  6. 很好,接近我想要的樣子了。

    不過一直想跟你說
    d(i) = Mid(a, i, 1)
    If d(i) = y Then e(y) = e(y) + 1
    這邊
    可以直接改成
    y = mid(a,i,1)
    e(y)=e(y)+1
    或是
    e(d(i))=e(d(i))+1

    其實那個d()陣列沒有必要啦

    回覆刪除
  7. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Dim e(10) As Long
    Dim d(99) As String
    Input #1, X1, Y1
    a = X1 * Y1
    b = Len(a)
    For i = 1 To b
    For j = 0 To 9
    d(i) = Mid(a, i, 1)
    If d(i) = j Then e(j) = e(j) + 1
    If i = b Then
    If e(j) <> 0 Then Print #2, j & e(j) & " ";
    End If
    Next j
    Next i
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  8. 哲好,
    程式正確。
    if i=b then
    這一部分,在雙迴圈中,有些浪費執行檢查時間,反正一定是最後會到達i=b,那麼就在外圈的地方,少一次,只有1 to b-1
    然後,雙迴圈執行完了之後,在雙迴圈之後,再加上一次內迴圈的部分,這一次,就是用 i=b的值去做的。

    回覆刪除