2012年5月28日 星期一

奇摩知識


內容 : 
題目描述
         大家都知道二進制是由0和1兩種數字組成的,十進制轉二進制, 小明現在要玩一個遊戲, 就是由1數到n,每數到一個數, 這個數的二進制有多少個1, 小明就要站起多少次, 例如數到9, 由於其二進制為1001, 所以小明要站起來兩次, 為了知道自己能否應付這個遊戲, 請你為小明算出, 由1數到n他必須站起來多少次?
輸入說明 :
每一行有一個數字N (1≦N≦1,0000,0000)
輸出說明 :
請輸出小明總共要站起來的次數。請輸出mod 1000000000 之後的結果
範例輸入 :help
12
範例輸出 :
22
提示 :
※ 數學、遞迴

5 則留言:

  1. Dim ans As Long
    Dim x As Long
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, x
    For i = 1 To x
    Call abc(i, ans)
    Next
    Print #2, ans
    Close
    Close
    End
    End Sub
    Function abc(ByVal a As Long, ByRef ans As Long)
    Do
    If a Mod 2 = 1 Then
    a = a \ 2
    ans = ans + 1
    Else
    a = a \ 2
    End If
    Loop Until a = 0
    End Function

    回覆刪除
  2. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, a
    ans = 0
    For i = 1 To a
    ans = ans + f(i)
    Next i
    Print #2, ans
    Close #2
    Close #1
    End
    End Sub
    Function f(ByVal x)
    Do
    If x Mod 2 = 1 Then
    f = f + 1
    x = x \ 2
    Else
    x = x \ 2
    End If
    Loop Until x = 0
    End Function

    回覆刪除
  3. 小冰好,
    程式正確。
    但是,函數沒有傳回值,那就用副程式吧。
    哲好,
    程式正確,而且正確使用函數,很好。

    但是兩個人的程式都同樣的問題,
    If a Mod 2 = 1 Then
    a = a \ 2
    ans = ans + 1
    Else
    a = a \ 2
    End If
    這一段程式,改成
    ans = ans + (a mod 2)
    a = a \2
    就好了。

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. Dim strA As String
    Dim ans As Integer
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, x
    For i = 1 To Val(x)
    nn = a(i)
    Next i
    Print #2, nn Mod 1000000000
    Loop
    Close #2
    Close #1
    End
    End Sub

    Function a(b)
    g = b Mod 2
    e = b \ 2
    If g = 1 Then ans = ans + 1
    If e > 0 Then Call a(e)
    a = ans
    End Function

    回覆刪除