添加 base62 数字
Posted
技术标签:
【中文标题】添加 base62 数字【英文标题】:Adding base62 numbers 【发布时间】:2015-01-28 14:59:47 【问题描述】:说,一个人有一个 base62 数字(字母:[aAbBcC-yYzZ0-9])char *num="abcd"
。 用于创建此类数字的字母由非字母顺序的字母组成! (在“a”之后的“A”,而不是“b”)。
如何获取序列的下一个数字(如何将 1 加到 base62 数字中)?下一个是“abce”,上一个是“abcc”。如果您能提供一些代码,我将不胜感激。
【问题讨论】:
这不是基数 52 吗? @JoachimPileborg,哦,对不起,我会改正的 字母,大写和小写,和数字(数字)是62 在后期编辑中澄清了问题。 【参考方案1】:对于诸如我如何以 N 为基数进行计算? 之类的问题,通常最好的答案是
从base-N转换为base-2(如果
N==2
很简单,很简单 否则),使用闪电般快速的硬件实现功能 您的计算机以 base-2 计算,然后从 base-2 转换为 碱基-N。
在拒绝我的荒谬建议时,请考虑一下您的计算机如何欺骗您,让您认为它执行的是 base-10 算术。
请注意,此方法符合 OP 的严格指令,以避免将数字转换为 base-10。
【讨论】:
哇,说实话,我从没想过base-2。这是个好主意。【参考方案2】:假设您有“数字”的顺序(例如字符串 "05DprPaGAg"
),那么这很容易。加一,找到数序字符串中的字母,得到下一个字母,减一,找到数序字符串中的字母,得到前一个字母。
如果您要减少的数字是最低位(示例字母表中的0
),则减少第二个最低有效位(通过使用上述方法)并使用最高位作为最低有效位要减少的数量。反之则增加。
【讨论】:
...但是当您将 25“增加”为 0 时,您还必须向左移动并添加 1。即“随身携带” 好的,如果我想这样做大约 1e9 次,那会非常慢,不是吗? @ForceBru 无论算法如何,执行许多操作都需要时间,但可以通过使用更好的数据结构来抵消。例如,如果您使用 C++ 编程,您可以使用例如std::map
将每个数字映射到包含下一个和上一个数字的std::pair
。 (注意:我实际上不知道这是否比搜索字符串更有效。)
@ForceBru 不,它会非常快。比你没有电脑自己做的要快数十亿倍。当然,它不会像使用计算机在 base 2 或 base 10 中执行相同的操作那样快。也许这就是我们倾向于不使用 base 62 的原因之一。【参考方案3】:
将每个字符映射到它所代表的数字(以 62 为基数)。
像手动一样使用简单的加法(如有必要,从最右边的位置开始)。
可以以几乎相同的方式执行减法(从最右边的位置开始,如果需要,在左边带一个“减一”)。
【讨论】:
@ForceBru 没有必要使用映射来将字符映射到某物。您可以使用一个简单的数组,其中digit[c]
是c
字符所代表的数字。
@ForceBru,如果你想要纯C,你应该从问题中删除[c++]标签
@AaronMcDaid,我放了两个标签,所以我希望得到与 C 和 C++ 相关的答案以上是关于添加 base62 数字的主要内容,如果未能解决你的问题,请参考以下文章