5

値が に収まらないN バイナリ桁の整数を手動long longで出力するスケーラブルなアルゴリズムは何ですか? 私は知っているprintfし、友人も<iostream>(おそらくピギーバック<cstdio>は標準型にこの組み込みを持っていますが、N バイトで構成される整数に対してそれを行いたいと思っています。

私はこれについて考えて少しグーグルで検索しましたが、常にGMP(私がまったく慣れていないコードベース)または「printfを使用する」または最も役立つ「これは難しい」などの既存のbigintライブラリを使用することになります。 .

整数は基本的に次のとおりです。

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

Integer<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:文字列形式で2つの数値を加算する関数を記述します。

ステップ3:番号のビットを繰り返し処理し、1ビットに対応するすべての文字列を追加します。

ステップ4:結果を印刷します。

私はこのアプローチを自分で非常に大きな浮動小数点数を印刷するために使用しましたが、それは私にとってはうまくいきました。

于 2012-06-14T17:41:53.347 に答える
2

10 進数を出力するための基本的な再帰アルゴリズム:

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 に答える