将数字向量从基数转换为基数

时间:2011-06-06 14:16:21

标签: c++ base

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

2 个答案:

答案 0 :(得分:1)

基本上你要做的是在基数a中实现div / mod b,然后对源数重复执行,建立目标数。当b < a,经典的长除法算法是最简单和最有效的方法,因为你总是处理单个数字。当b> a,它有点棘手;你可以使用经典的长除法,或者隐式地首先将数字转换为基数a ^ k,其中a ^ k&gt; = b并且适合int(一个普通的转换),然后使用单位数长除法方法转换为湾

当然,如果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;
}

答案 1 :(得分:0)

  

我考虑使用标准基本转换算法,但数字甚至不适合long long

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

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