5

什么是手动打印其值不适合的 N 二进制数字整数的可扩展算法long long。我认识printf和朋友,以及<iostream>(最有可能搭载的<cstdio>是标准类型的内置函数,但我想对由 N 个字节组成的整数执行此操作。

我已经考虑过这一点并在谷歌上搜索了一下,但它总是归结为使用预先存在的 bigint 库,如 GMP(我完全不熟悉的代码库)或“使用 printf”或最有用的“这很难” .

整数基本上是:

template<size_t N>
class Integer{
...
private:
    int8_t first;
    uint8_t rest[N-1];
}

所以重新解释 aInteger<4>的字节会给你一个int32_t. 我想将其缩放到 N>8。目前,效率并不是我真正关心的问题。字节顺序也不是(这是针对 x86 的)。

4

2 回答 2

5

第 1 步:以字符串格式定义一个包含 2 的幂的查找表:

const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...};

第 2 步:编写一个函数,以字符串格式将两个数字相加。

第 3 步:遍历数字中的位并添加与 1 位对应的所有字符串。

第 4 步:打印结果。

我自己使用这种方法来打印非常大的浮点数,它对我来说效果很好。

于 2012-06-14T17:41:53.347 回答
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;
}

我暂时没有定义辅助函数,也许这已经足够了。

于 2012-06-14T18:03:44.253 回答