C++ 将数字向量从基转换为基
如果不使用gmp之类的库,如何将baseC++ 将数字向量从基转换为基,c++,base,C++,Base,如果不使用gmp之类的库,如何将basea中的向量转换为baseb中的向量? 包含数字的数字a和b小于1024a可以小于或大于b 我曾考虑过使用标准的基数转换算法,但即使在long中,数字也不适合 我曾考虑过使用标准的基数转换算法,但即使在long中,数字也不适合 这是正确的(如“干净”)方法。由于数字不适合本机数字类型,并且您不想使用现有的库,因此您基本上需要实现自己的数字类型,或者至少实现转换算法所需的必要操作(加法、除法、模数) 最简单(虽然不是最有效)的方法是实现经典算法。基本上,您要做
a
中的向量
转换为baseb
中的向量?
包含数字的数字<代码>a
和b
小于1024a
可以小于或大于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我相信你可以找到一种方法来编辑你的评论,这样会很有成效。否则,这只是现场的噪音。