2012-06-14 13 views
5

Nバイナリ桁の整数を手動で印刷するスケーラブルなアルゴリズムとは何ですかの値がlong longに収まらない場合。私はprintfとお友達を<iostream>と一緒に知っています(<cstdio>のピギーバックは標準タイプの組み込みですが、Nバイトからなる整数のためにしたいと思います)。Nバイトの整数を手動で印刷する

私はこれについて考えましたGMPのような既存のbigint libiraryを使ったり、 "use printf"や "これは難しい"という最も有用な "これは難しい"を使うようになっています。

整数は基本的に:

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

Integer<4>のバイトを再解釈するあなたはint32_tになります。これをN> 8に拡大したいと思います。効率は現時点では私の心配ではありません。エンディアンも(これはx86用です)。

+2

数字を10進数で印刷する必要がありますか? – NPE

+0

@aixはい10進数が考えられます。 – rubenvb

+0

私の助言は、とにかくbigintライブラリを使うことです。これらのライブラリはデバッグされ、実証されています。あなた自身のコーディングの欠陥をどのように見つけますか?ペン&ペーパーやExcelで結果を確認するのと同じではありません。 – tomdemuyt

答えて

5

ステップ1:文字列形式で2のべき乗を含むルックアップテーブルを定義します。

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

ステップ2:文字列形式で2つの数値を追加する機能を書きます。

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

手順4:結果を印刷します。

私はこのアプローチを非常に大きな浮動小数点数の印刷に使用してくれました。

+0

非常に賢いフレッド! –

+2

あなたは2のべき乗のテーブルを必要としません:2を乗算するためにそれ自身に数を加えてください。ビットが1の場合は数値に1を加え、 repeat ==> profit – anatolyg

+0

これは簡単に修正できますが、正の数でのみ機能することに注意してください。ブリリアント。 –

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; 
} 

を私はおそらくこれで十分です、今のところ未定義ヘルパー関数を残してきました。

+0

ありがとう。私は算術演算を持っていません(私は結果を最初に見たいと思っていました)ので、まずは@ Fredの提案を試してみましょう。後で両方のアプローチのパフォーマンスを比較することができます。 – rubenvb

関連する問題