【问题标题】:Converting vector of digits from base to base将数字向量从基数转换为基数
【发布时间】:2011-06-06 14:16:20
【问题描述】:

如何在不使用 gmp 之类的库的情况下将基础 a 中的 vector<int> 转换为基础 b 中的 vector<int>
包含数字的数字。 ab 小于 1024。a 可以小于或大于 b
我考虑过使用标准的基本转换算法,但数字甚至不适合 long long

【问题讨论】:

  • 我不明白你在做什么。只要它仍然是一个整数,数字的基数就无关紧要。只有当您转换为字符串时,基础才是重要的。你不能在一个特定的基础上有一个 int,这个概念没有意义。
  • 它不是 int,它是基数 ab 中的数字的数组
  • 如果我理解正确的话,你有代表数字的各个数字的整数向量?
  • @Tomalak Geret'kal 我相信您可以找到一种方法来编辑您的评论,从而提高工作效率。否则,这只是这个网站上的噪音。

标签: c++ base


【解决方案1】:

基本上,您要做的是在基数 a 中实现 div/mod b,然后在源编号上重复执行此操作,建立目标编号。当 b a 时,它有点棘手;您可以使用经典的长除法,或者先将数字隐式转换为基数 a^k,其中 a^k >= b 并适合 int(简单的转换),然后使用单位数长除法转换为 b .

当然,如果 a == b^k 或 a^k == b(一个基数是另一个基数的整数幂)它非常简单,因为您根本不需要除法。很大程度上取决于“a”和“b”是否是不会改变的实际常量,或者它们是否是变量。

template<int A, int B> int divmod(std::vector<int> &a) {
    // a is a vector of digits in base A
    // divide a by B in place, returning the remainder
    // implementation left as an exercise for the reader
}

template<int A, int B> std::vector<int> cvtBase(std::vector<int> a) {
    // a is a vector of digits in base A
    // convert it to a vector of digits in base B
    // vectors are in little endian order (least significant digit first)
    std::vector<int> b;
    do {
        b.push_back(divmod<A,B>(a));
    } while (!isZero(a));
    return b;
}

【讨论】:

    【解决方案2】:

    我考虑过使用标准的基本转换算法,但即使在 long long 中,数字也不适合。

    这是正确的(如:“干净”)方法。由于数字不适合本地数字类型,并且您不想使用现有库,因此您基本上需要实现自己的数字类型,或者至少需要实现所需的操作(加法、除法、模数)用于转换算法。

    最简单(虽然不是最有效)的方法是实现经典的long division 算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      相关资源
      最近更新 更多