重点是要学会如何利用按权展开式求和,算法了解了,代码就不难了。
Dim a As String, aa As Integer, b As String, bb As Integer, c As Integer
aa = InputBox("输入的是几进制数?")
aa = Trim(aa)
a = InputBox("数是多少?")
a = Trim(a)
For i = 1 To Len(a)
b = Mid(a, i, 1)
If (b > 9) Then
bb = 10 + b - Asc("A")
Else
bb = Val(b)
End If
c = c + bb * aa ^ (Len(a) - i)
Next i
MsgBox "结果是:" & c
临时写的,简单测试通过。
注释也应该写全了,复制直接可用。
有什么不清楚的,追问好了。
Option Explicit
' 最大支持36进制,因为超过这个进制不知道以什么字符来表示了
' 字符表示:
' 11进制: A=10
' 12进制: B=11
' 13进制: C=12
' 14进制: D=13
' 15进制: E=14
' 16进制: F=15
' 17进制: H=16
' 18进制: I=17
' 依次类推
' 参数:
' Text 需要转换的字符串
' 字符串首字符为(-)时,作为负数进行计算。
' 字符串前2字符为(0x, &H, &O)时,自动转换进制为其相应的进制。
' Radix 需要转换为的进制基数(可选输入参数:默认值为10进制)
' 返回:
' 有符号8字节整数
' 为调用时可以获得到转换失败,所以内部没有做融错处理
' 调用时可以使用On Error捕获错误后,给出默认数值
Public Function ToDec(ByVal Text As String, Optional Radix As Integer = 10) As Currency
Const Chars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
' 变量声明
Dim i As Long
Dim Index As Integer
Dim Length As Long
Dim Sign As Long
Dim Result As Currency
' 初始化
Text = UCase(Text)
Length = Len(Text)
Sign = 1
Result = 0
' 符号位检查
If Length >= 1 Then
If Mid(Text, 1, 1) = "-" Then
Sign = -1
Text = Mid(Text, 2)
Length = Length - 1
End If
End If
' 进制表达式检查
If Length >= 2 Then
Select Case Mid(Text, 1, 2)
Case "0x" ' 16进制(C)
Radix = 16
Text = Mid(Text, 3)
Length = Length - 2
Case "&H", "&h" ' 16进制(Basic)
Radix = 16
Text = Mid(Text, 3)
Length = Length - 2
Case "&O", "&o" ' 8进制(Basie)
Radix = 8
Text = Mid(Text, 3)
Length = Length - 2
End Select
End If
' 转换每个字符
For i = 1 To Length
Index = InStr(Chars, Mid(Text, i, 1)) - 1
If Index = -1 Then
Exit For
ElseIf Index > Radix Then
Exit For
End If
Result = Result * Radix + Index
Next
' 符号位处理
Result = Result * Sign
' 返回
ToDec = Result
End Function
Private Sub Form_Load()
' 测试
MsgBox ToDec("-&HFF") ' Return -255
MsgBox ToDec("-FF", 16) ' Return -255
MsgBox ToDec("-&HFF", 15) ' Return -255
MsgBox ToDec("-FF", 15) ' Return -240
MsgBox ToDec("-FF", 11) ' Return 0
MsgBox ToDec("-FF") ' Return 0
End
End Sub
你这个n是指任意的数吗?如果是,那么就有个难点,假如n大于10,那么用什么符号来表示大于10小于n的数?我们知道16进制数用ABCDEF表示10到15这6个数,那么36进制呢?用10个阿拉伯数字+26个字母?那么再大呢?……所以我认为这个n不能是任意的数。
如果是常用的二进制、八进制、十六进制,那么就好办得多:
Function Nto10(s As String, n As Integer) As Long
If n = 8 Then
Nto10 = Val("&O" & s)
ElseIf n = 16 Then
Nto10 = Val("&H" & s)
ElseIf n = 2 Then
Dim i As Integer
For i = 1 To Len(s)
Nto10 = Nto10 + Val(Mid(s, i, 1)) * 2 ^ (Len(s) - i)
Next
Else
Nto10 = 0
End If
End Function
调用方法:
16进制: MsgBox Nto10("6B3F", 16)
8进制: MsgBox Nto10("1356", 8)
2进制: MsgBox Nto10("10011010", 2)