添加 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 数字的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 实现 URL 安全的 Base62 转码

LeetCode 62. 圆圈中最后剩下的数字

剑指 Offer 62. 圆圈中最后剩下的数字

LeetCode 面试题62. 圆圈中最后剩下的数字

[LeetCode]面试题62. 圆圈中最后剩下的数字(数学)

[LeetCode]面试题62. 圆圈中最后剩下的数字(数学)