ホームページ > バックエンド開発 > C++ > 任意の大きな整数を処理するために C で BigInt クラスを実装するにはどうすればよいですか?

任意の大きな整数を処理するために C で BigInt クラスを実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-22 00:09:59
オリジナル
666 人が閲覧しました

How to Implement a BigInt Class in C   for Handling Arbitrarily Large Integers?

C での BigInt クラスの実装

C では、long int より大きい数値を処理する場合、カスタム " big int」クラス。これらの概念をより深く理解するには、外部実装に依存する代わりに、独自の実装を作成することを検討してください。

データ構造

単純なアプローチには、数値を文字列として保存することが含まれます。 、それをより小さな数値(数字など)に分割し、配列に配置します。これにより、比較演算が簡略化されますが、加算や乗算などの演算に関して懸念が生じます。

アルゴリズムの概要

これらの演算では、整数の 2 進数の性質を考慮することが有益です。例として加算演算子 (=) を実装し、各数字のペアを反復処理して加算します。結果が BaseType をオーバーフローした場合は、超過分を次の桁に繰り越します。

コード例

template< class BaseType >
BigInt< BaseType >&amp; BigInt< BaseType >::operator += (BigInt< BaseType > const&amp; operand)
{
  BT count, carry = 0;
  for (count = 0; count < std::max(value_.size(), operand.value_.size(); count++)
  {
    BT op0 = count < value_.size() ? value_.at(count) : 0, 
       op1 = count < operand.value_.size() ? operand.value_.at(count) : 0;
    BT digits_result = op0 + op1 + carry;
    if (digits_result-carry < std::max(op0, op1)
    {
      BT carry_old = carry;
      carry = digits_result;
      digits_result = (op0 + op1 + carry) >> sizeof(BT)*8; // NOTE [1]
    }
    else carry = 0;
  }
 
  return *this;
}
ログイン後にコピー

実装ノート

  • BaseType は BigInt の基礎となる型です。例: int または long。
  • value_ ベクトルは、数値の個々の桁を格納します。
  • キャリーは、桁間のオーバーフローを追跡します。
  • オーバーフローの検出は、結果を比較することによって行われます。

その他演算子

減算、乗算、除算に対してこのアルゴリズム的アプローチを繰り返します。 << のような標準演算子を実装します。出力の場合は <

結論

カスタム BigInt クラスの構築は、難しいですがやりがいのある作業です。ここで説明する手順に従うと、C で任意の大きな整数を処理する機能的で効率的なクラスを実装することができます。

以上が任意の大きな整数を処理するために C で BigInt クラスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート