|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
VBA只提供了 8 和16进制转换函数,Oct 和 Hex,这是两种在各个领域使用比较多的进制。
到底可以有多少进制?理论上能够找到多少不同字符,就可以有多少进制。
如果用汉字作为进制的表示字符,搞出1000 进制2000进制也不是问题。
这种特殊进制有什么用?别的作用不知道,但最起码起到了数字加密的作用。
FF 这是一个16进制数, 10进制就是255,这对经常和程序打交道的人来说没有秘密,
但对于不懂的人来说这就是天书。
如果借助汉字编写一个188进制的转换函数,对某个数字进行转换后的结果是:
中华人民共和国万岁
是不是很酷?
如果不知道是188进制,也不知道是采用的是哪188个汉字,根本不可能知道这个数字是什么。
题目 2分
编写两个函数,
1.转换Long 值(-2147483648 到 2147483647)为N进制字符串
2.转换N进制字符串 为 Long值(-2147483648 到 2147483647)
要求:纯VBA代码,不得使用API, 不得引用外部对象。常数 Jzs 不得修改。
为使代码简洁、易读,假定传入的参数都是正确合理的,即不会出现 N2ChrX(40000,37) 、
ChrX2N("FFFF",2) 此类参数错误。代码中不需要使用 On Error 语句。
数字0 和 字母 O 看起来很像的问题不用考虑。
评分标准:结果正确、代码效率达到要求,一个函数 1 分
- Function N2ChrX(ByVal L As Long, ByVal N As Integer) As String
- '作用:将Long值转换为 N 进制所表示的字符串
- '参数说明 L 要转换的值, N (2-36) 将要使用的进制数
- Const Jzs As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- End Function
- Function ChrX2N(ByVal S As String, ByVal N As Integer) As Long
- '作用:字符串值转换为 N 进制所表示的字符串
- '参数说明 S 要转换的N进制字符串, N (2-36) 对S变量进制数的说明
- Const Jzs As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- S = UCase(S)
-
- End Function
- '结果正确与否请自行验证,代码效率可用下面代码测试。
- Sub 效率验证N2ChrX()
- Dim L As Long, i As Long, v As Long, t As Double, t2 As Double
- t = Timer
- v = 65535
- For i = 1 To 1000000
- S = Hex(v)
- Next
- t = Timer - t
- t2 = Timer
- For i = 1 To (i - 1) / 10
- S = N2ChrX(v, 16)
- Next
- t2 = Timer - t2
- Index = t2 / t * 10 '(越小越好,我的参考指数平均为 15-20 )
- MsgBox "代码效率指数为 " & Index & IIf(Index < 100, " 不错!如结果正确可得分", " 太慢了不得分")
- End Sub
- Sub 效率验证ChrX2N()
- Dim L As Long, i As Long, v As Long, t As Double, t2 As Double
- t = Timer
- v = 65535
- For i = 1 To 1000000
- S = Hex(v)
- Next
- t = Timer - t
- t2 = Timer
- For i = 1 To (i - 1) / 10
- L = ChrX2N("FFFF", 16)
- Next
- t2 = Timer - t2
- Index = t2 / t * 10 '(越小越好,我的参考指数平均为 20-25 )
- MsgBox "代码效率指数为 " & Index & IIf(Index < 100, " 不错!如结果正确可得分", " 太慢了不得分")
- End Sub
- Sub 自检()
- Dim L As Long, L2 As Long, I As Integer, Boo As Boolean, S As String, Lrr(-1000 To 1002) As Long
- V = 65535
- t = Timer
- For L = 1 To 74000
- S = Hex(V)
- Next
- t = Timer - t
- Boo = True
- For L = -1000 To 1000
- Lrr(L) = L
- Next
- Lrr(1001) = -2147483648#
- Lrr(1002) = 2147483647
- t1 = Timer
- For L = -1000 To 1002
- For I = 2 To 36
- L2 = ChrX2N(N2ChrX(Lrr(L), I), I)
- Boo = (Lrr(L) = L2) And Boo
- 'If Boo = False Then Stop
- Next
- Next
- For L = -1000 To 1002
- L2 = ChrX2N(Hex(Lrr(L)), 16)
- Boo = (Lrr(L) = L2) And Boo
- 'If Boo = False Then Stop
- Next
- For L = -1000 To 1002
- L2 = ChrX2N(Oct(Lrr(L)), 8)
- Boo = (Lrr(L) = L2) And Boo
- 'If Boo = False Then Stop
- Next
- t1 = Timer - t1
- Index = t1 / t
- Debug.Print "效率指数:" & Index; " 200之内 可以结受"
- If Boo Then
- MsgBox "自检成功,有机会得分,具体还要看实际结果, 效率指数:" & Index
- Else
- MsgBox "自检有错误,不得分" & " 效率指数:" & Index
- End If
- End Sub
复制代码 答题后 请运行 自检 程序
答题者请跟帖占位,跟帖中不要出现与题目相关的内容,否则不予评分。
截止日期 2009-10-20 以发邮件时间为准。
答案请按如下格式发送到邮箱 26258103@163.com (不需要附件,纯文字即可)
邮件主题: VBA53期国庆附加题答案
邮件内容:
- 'ID : xxxxxxxxxxxxxxxx
- Function N2ChrX(ByVal L As Long, ByVal N As Integer) As String
- '作用:将Long值转换为 N 进制所表示的字符串
- '参数说明 L 要转换的值, N (2-36) 将要使用的进制数
- Const Jzs As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- End Function
- Function ChrX2N(ByVal S As String, ByVal N As Integer) As Long
- '作用:字符串值转换为 N 进制所表示的字符串
- '参数说明 S 要转换的N进制字符串, N (2-36) 对S变量进制数的说明
- Const Jzs As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- S = UCase(S)
-
- End Function
复制代码 参考答案:
- 'ID : LDY
- Function N2ChrX(ByVal L As Long, N As Integer) As String
- Const Jzs As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- Dim v As Double, x As Double, y As Long
- If N = 10 Then N2ChrX = L: Exit Function' 10进制转10进制没必要处理,直接赋值
- v = L - (L < 0) * 4294967296# '把负数转为 正数 赋值给 Double
- Do
- N2ChrX = Mid(Jzs, v - Int(v / N) * N + 1, 1) & N2ChrX
- v = Int(v / N)
- Loop While v > 0
- End Function
- Function ChrX2N(ByVal S As String, N As Integer) As Long
- Const Jzs As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- Dim i%, v As Double
- S = UCase(S)
- If N = 10 Then ChrX2N = S: Exit Function
- For i = 1 To Len(S)
- v = v + (InStr(Jzs, Mid$(S, i, 1)) - 1) * N ^ (Len(S) - i)
- Next
- ChrX2N = v + (v > 2147483647) * 4294967296#
- End Function
复制代码
结贴 http://club.excelhome.net/viewthread.php?tid=484032&page=4#pid3244334
[ 本帖最后由 ldy 于 2009-10-22 15:13 编辑 ] |
评分
-
1
查看全部评分
-
|