[進制轉換與計數] 輸入 1 個十進位整數 n,0 ≤ n ≤ 1,000,000,將其轉換為十 六進位表示法(以符號 0 ~ F 表示),請計算該十六進位表示法中,某十六進位符號 出現的次數。舉例來說,若輸入 n=851763,其十六進位表示為 CFF33,則其中十 六進位符號 F 出現 2 次,另一個十六進位符號 3 亦出現 2 次。 輸入/輸出說明:請在表單上建立 2 個 LABEL、3 個 TEXTBOX 及一個按鈕。第 1 個 LABEL 標示「輸入 n」,相對應的第 1 個 TEXTBOX 可以輸入一個整數 n,第 2 個 LABEL 標示「輸入十六進位符號」,相對應的第 2 個 TEXTBOX 可以輸入一個介於 {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} 之間的十六進位符號(英文字母的部份大 寫),按下按鈕後,在第 3 個 TEXTBOX 中,輸出該十六進位符號在該十六進位數值 中出現的次數。程式執行順序:輸入 n,輸入十六進位符號,按下按鈕,輸出。 家豪版 這一版是相當傳統的基本動作,長除 16 即可。 Dim f0(15) As Integer Dim k As Integer, n As Integer = Val(TextBox1.Text) If (n > 1000000) Then MsgBox("n 超出範圍 0 <= n <= 1000000,請重新輸入。") Exit Sub End If TextBox3.Text = "" Do While (n > 0) "計算每一數字的次數 k = n Mod 16 f0(k) += 1 n \= 16 Loop If (TextBox2.Text > "9") Then "超出 9 , 須把 A ~ F 轉成 10 ~ 15 k = Asc(TextBox2.Text) - Asc("A") + 10 Else k = Val(TextBox2.Text) End If TextBox3.Text = f0(k) 這程式有防呆動做,輸入小寫可以轉大寫。 Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress If ((e.KeyChar >= "a") And (e.KeyChar <= "f")) Then e.KeyChar = StrConv(e.KeyChar, vbUpperCase) "小寫轉大寫 End If e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8) Or ((e.KeyChar >= "A") And (e.KeyChar <= "F"))) End Sub 昊朋版 這一版相當簡潔,不過要了解 VB.net String 物件的 Replace 用法。 https://msdn.microsoft.com/zh-tw/library/fk49wtc1(v=vs.110).aspx Dim sc() As Integer = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} Dim n As Integer = Val(TextBox5.Text) Do While (n > 0) sc(n Mod 16) += 1 n \= 16 Loop TextBox7.Text = sc(Val(TextBox6.Text _ .Replace("A", "10") _ .Replace("B", "11") _ .Replace("C", "12") _ .Replace("D", "13") _ .Replace("E", "14") _ .Replace("F", "15"))) 黃翰版 此版與家豪版相同,雖然少了一些提升效率小動作,但基本工相當不錯。 Dim n As Integer = TextBox1.Text, count, x As Integer Dim ch As Char = TextBox2.Text Dim es_16 As String = "0123456789ABCDEF" If n < 0 Or n > 1000000 Then MsgBox("n範圍在0~1000000,您已超出範圍") Exit Sub End If While n > 0 x = n Mod 16 n \= 16 If ch = Mid(es_16, x + 1, 1) Then count += 1 End If End While TextBox3.Text = count |