【问题标题】:Adding base62 numbers添加 base62 数字
【发布时间】:2015-01-28 14:59:47
【问题描述】:

说,一个人有一个 base62 数字(字母:[aAbBcC-yYzZ0-9])char *num="abcd"用于创建此类数字的字母由非字母顺序的字母组成! (在“a”之后的“A”,而不是“b”)

如何获取序列的下一个数字(如何将 1 加到 base62 数字中)?下一个是“abce”,上一个是“abcc”。如果您能提供一些代码,我将不胜感激。

【问题讨论】:

  • 这不是基数 52 吗?
  • @JoachimPileborg,哦,对不起,我会改正的
  • 字母,大写和小写,和数字(数字)是62
  • 在后期编辑中澄清了问题。

标签: c++ c algorithm


【解决方案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】:
  1. 将每个字符映射到它所代表的数字(以 62 为基数)。

  2. 像手动一样使用简单的加法(如有必要,从最右边的位置开始)。

  3. 可以以几乎相同的方式执行减法(从最右边的位置开始,如果需要,在左边带一个“减一”)。

【讨论】:

  • @ForceBru 没有必要使用映射来将字符映射到某物。您可以使用一个简单的数组,其中digit[c]c 字符所代表的数字。
  • @ForceBru,如果你想要纯C,你应该从问题中删除[c++]标签
  • @AaronMcDaid,我放了两个标签,所以我希望得到与 C 和 C++ 相关的答案
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多