在没有递归的情况下在 Visual Basic(或伪代码算法)中寻找十进制到字母数字的基本转换器库
Posted
技术标签:
【中文标题】在没有递归的情况下在 Visual Basic(或伪代码算法)中寻找十进制到字母数字的基本转换器库【英文标题】:Looking for decimal to alphanumeric number base converter library in Visual Basic (or pseudo code algorithm) WITHOUT recursion 【发布时间】:2012-03-16 11:29:41 【问题描述】:我正在寻找不使用递归的 Visual Basic 中的十进制到字母数字基数转换器库。
我发现: http://visualstudiomagazine.com/articles/2010/07/20/when-hexadecimal-is-not-enough.aspx
其中包含一个演示应用程序,但发现它使用递归。当我尝试将库集成到我自己的 Visual Studio Express 2010 Visual Basic 项目中时,使用递归的问题变得很明显:我遇到了堆栈溢出异常。
现在我可以考虑增加为堆栈分配的内存大小,但可能很难确定这是什么,因为递归深度可能会因要转换的值而异。
我的情况需要一个可靠的确定性解决方案,所以我宁愿不考虑使用递归的想法。
我将做更多的研究并努力从头开始编写算法,但如果它已经存在,我宁愿不重新发明***,所以这个问题。在这里搜索并没有完全找到我想要的东西。
您能否指出 Visual Basic 中现有的非递归十进制到字母数字转换器库的方向?
【问题讨论】:
它有一个指向这个的链接(不检查它是否使用递归):devx.com/vb2themax/Tip/19316 +1 @assylias 谢谢它看起来很有希望,现在检查一下...... 是的,看起来没有递归:) 我看过了,它不是最易读的代码,VB 使用函数名作为返回值可能会产生误导,但是是的,似乎没有递归。所以现在我要将它集成到我的 Visual Studio 2010 Express Visual Basic 项目中并进行测试。我会报告,然后,如果好的@assylias,如果你提供这个作为答案,我应该能够接受并投票。 如果你设法让它工作,发布你的代码作为答案,它会比一个链接更好;) +1 再次@assylias,我会尝试,但我希望你能接受:你所要做的就是发布与答案相同的评论(我会赞成并接受)。但是暂时不要这样做——一旦我发现代码可以工作,我会告诉你继续。我的工作期限很紧,所以今天晚些时候可能会有一些结果...... 【参考方案1】:我自己提供的这个解决方案似乎很有效 - 也很简单!但那是因为它是一种单向转换;其他库的目标是双向转换,在不同的基础之间来回转换 - 但我不需要两种方式。
Public Class BaseConverter
Public Shared Function ConvertToBase(num As Integer, nbase As Integer) As String
Dim retval = ""
Dim chars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
' check if we can convert to another base
If (nbase chars.Length) Then
retval = ""
End If
Dim r As Integer
Dim newNumber As String = ""
' in r we have the offset of the char that was converted to the new base
While num >= nbase
r = num Mod nbase
newNumber = chars(r) & newNumber
'use: num = Convert.ToInt32(num / nbase)
'(if available on your system)
'otherwise:
num = num \ nbase
' notice the back slash \ - this is integer division, i.e the calculation only reports back the whole number of times that
' the divider will go into the number to be divided, e.g. 7 \ 2 produces 3 (contrasted with 7 / 2 produces 3.5,
' float which would cause the compiler to fail the compile with a type mismatch)
End While
' the last number to convert
newNumber = chars(num) & newNumber
Return newNumber
End Function
End Class
我根据以下链接中的 C# 代码在 Visual Basic 中创建了上述代码:
信用:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5babf71f-4375-40aa-971a-21c1f0b9762b/ ("从十进制(base-10) 转换为字母数字(base-36)")
public String ConvertToBase(int num, int nbase)
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// check if we can convert to another base
if(nbase chars.Length)
return "";
int r;
String newNumber = "";
// in r we have the offset of the char that was converted to the new base
while(num >= nbase)
r = num % nbase;
newNumber = chars[r] + newNumber;
num = num / nbase;
// the last number to convert
newNumber = chars[num] + newNumber;
return newNumber;
@assylias 我无法让devx.com/vb2themax/Tip/19316 工作 - 我得到了错误的值。不过还是谢谢你的建议。
没有证据表明它有效。我调整了代码的一些声明和表面结构,使其在 Visual Studio Express 2010 Visual Basic 中成功构建。然后单步调试 Visual Studio Express 2010 Visual Basic 调试器中的代码,代码很难理解:变量名不明显,没有关于它为什么这样做的原因。根据我的理解,它似乎不应该这样做来进行基本转换。
【讨论】:
以上是关于在没有递归的情况下在 Visual Basic(或伪代码算法)中寻找十进制到字母数字的基本转换器库的主要内容,如果未能解决你的问题,请参考以下文章
我可以在没有安装 Visual Studio 的情况下在 Windows 服务器上构建 .NET Core 应用程序吗?
如何在没有Javascript调试的情况下在网站启动时在Visual Studio中启动新的Chrome实例?
如何在没有 SQL Server Management Studio 的情况下在 SQL Server Express LocalDB 中使用 Visual Studio 2013 创建两个表之间的关
Visual basic System.Data.OleDb.OleDbException:“没有为一个或多个必需参数提供值。”