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

C++ 将数字向量从基转换为基,c++,base,C++,Base,如果不使用gmp之类的库,如何将basea中的向量转换为baseb中的向量? 包含数字的数字a和b小于1024a可以小于或大于b 我曾考虑过使用标准的基数转换算法,但即使在long中,数字也不适合 我曾考虑过使用标准的基数转换算法,但即使在long中,数字也不适合 这是正确的(如“干净”)方法。由于数字不适合本机数字类型,并且您不想使用现有的库,因此您基本上需要实现自己的数字类型,或者至少实现转换算法所需的必要操作(加法、除法、模数) 最简单(虽然不是最有效)的方法是实现经典算法。基本上,您要做

如果不使用gmp之类的库,如何将base
a
中的
向量
转换为base
b
中的
向量?
包含数字的数字<代码>a
b
小于1024
a
可以小于或大于
b

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

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

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


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

基本上,您要做的是在a基中实现一个div/mod b,然后在源编号上重复这样做,建立目标编号。当ba时,有点棘手;您可以使用经典的长除法,或者先隐式地将数字转换为以a^k为基数的a^k,其中a^k>=b并适合整数(一种简单的转换),然后使用单位数长除法将其转换为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;
}
模板int-divmod(std::vector&a){
//a是基数a中的数字向量
//就地将a除以B,返回余数
//实现留给读者作为练习
}
模板std::vector cvtBase(std::vector a){
//a是基数a中的数字向量
//将其转换为基数B中的数字向量
//向量以小端顺序排列(最低有效位在前)
std::载体b;
做{
b、 推回(divmod(a));
}而(!isZero(a));
返回b;
}

我不明白你想做什么。只要数字仍然是int,它的基数就不相关。只有当转换为字符串时,基数才是重要的。你不能在一个特定的基中有一个int,这个概念毫无意义。它不是int,它是一个基数
a
b
中的数字数组,所以如果我理解正确,你有代表一个数字的各个数字的整数向量吗?@Tomalak Geret'kal我相信你可以找到一种方法来编辑你的评论,这样会很有成效。否则,这只是现场的噪音。