什么是可伸缩算法来手动打印N二进制数字整数 ,其值不适合long long
。我知道printf
和朋友以及<iostream>
(<cstdio>
上最有可能背驮式的内置标准类型,但我想为一个由N个字节。
我已经考虑了这个并且用谷歌搜索了一下,但它总是归结为使用像GMP这样的预先存在的bigint图书馆(我根本不熟悉的代码库)或“使用printf”或者最有帮助的“这个很难“。
整数基本上是:
template<size_t N>
class Integer{
...
private:
int8_t first;
uint8_t rest[N-1];
}
所以重新解释一个Integer<4>
的字节会得到int32_t
。我想将其缩放到N> 8。目前效率并不是我真正关心的问题。也不是字节序(这是针对x86)。
答案 0 :(得分:5)
步骤1:以字符串格式定义包含2的幂的查找表:
const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...};
步骤2:编写一个以字符串格式添加两个数字的函数。
步骤3:遍历数字中的位并添加与1位对应的所有字符串。
第4步:打印结果。
我自己使用这种方法来打印非常大的浮点数,它对我来说很好。
答案 1 :(得分:2)
输出十进制数的基本递归算法:
void negate(Integer & number); // modifies the input
int divide_by_10(Integer & number); // modifies the input
bool is_zero(const Integer & number);
void output_number(Integer number)
{
if (number.first < 0)
{
cout << "-";
negate(number);
}
if (is_zero(number))
{
cout << "0";
return;
}
int remainder = divide_by_10(number);
if (!is_zero(number))
output_number(number);
char digit[] = {'0', 0};
digit[0] += remainder;
cout << digit;
}
我暂时没有定义辅助函数,也许这就足够了。