內容 :
題目描述
大家都知道二進制是由0和1兩種數字組成的,十進制轉二進制, 小明現在要玩一個遊戲, 就是由1數到n,每數到一個數, 這個數的二進制有多少個1, 小明就要站起多少次, 例如數到9, 由於其二進制為1001, 所以小明要站起來兩次, 為了知道自己能否應付這個遊戲, 請你為小明算出, 由1數到n他必須站起來多少次?
大家都知道二進制是由0和1兩種數字組成的,十進制轉二進制, 小明現在要玩一個遊戲, 就是由1數到n,每數到一個數, 這個數的二進制有多少個1, 小明就要站起多少次, 例如數到9, 由於其二進制為1001, 所以小明要站起來兩次, 為了知道自己能否應付這個遊戲, 請你為小明算出, 由1數到n他必須站起來多少次?
輸入說明 :
每一行有一個數字N (1≦N≦1,0000,0000)
輸出說明 :
請輸出小明總共要站起來的次數。請輸出mod 1000000000 之後的結果
範例輸入 :
12
範例輸出 :
22
提示 :
※ 數學、遞迴
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
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
小冰好,
回覆刪除程式正確。
但是,函數沒有傳回值,那就用副程式吧。
哲好,
程式正確,而且正確使用函數,很好。
但是兩個人的程式都同樣的問題,
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
就好了。
作者已經移除這則留言。
回覆刪除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