3

C++ の係数について質問があります。私がやろうとしていたのは、非常に大きな数を割ることでした。たとえば、M % 2 としましょう。ここで、M = 54,302,495,302,423 です。ただし、コンパイルに行くと、整数の場合は「長い」と表示されます。次に、ダブルに切り替えると、同じエラーメッセージが繰り返されます。この非常に大きな数の残り、またはさらに大きな数を取得する方法はありますか? ご協力いただきありがとうございます。

4

4 に答える 4

3

数値を「long long」(64 ビット整数値) に格納してみることができますが、アプリケーションがマルチスレッドで 32 ビット CPU で実行されている場合は、これを読み書きするときにスレッド間で同期する必要があることに注意してください。読み取り/書き込みに 2 クロック サイクルかかるため、

または、 bignum ライブラリを試してください

物事を面白くしたい場合、モジュロ 2 しか実行していない場合は、最下位ビットをチェックして答えを得ることができます。モジュロ 255 までしか実行していない場合は、最下位の 8 (符号なし char) ビットを取得して、それらに対して操作を実行できます。モジュロ 65535 までしか実行していない場合は、最下位 16 ビット (unsigned short) を取得して、それらに対して操作を実行できます。

于 2010-03-13T21:32:31.290 に答える
2

C++ での大数演算には、GMPライブラリを使用します。特に、mpz_mod関数はこれを行います。

より自然な C++ ラッパーの場合、このmpz_classクラスは、多倍精度演算の演算子のオーバーロードを提供することで役立ちます。

于 2010-03-13T21:31:25.653 に答える
0

ヒント: リンクされたリストを使用します。数値を数値のグループとして動的に格納します。例:

112233445566778899001122 => 11223344 55667788 99001122

次に、個々のユニットを考えて、左から右に始めます。リマインダーを見つけて操作し、次のグループに追加して続行します。

実装はとても簡単です:)

編集:

112233445566778899001122/6 =>  11223344 55667788 99001122/6


 11223344/6 =>2

 2*100000000 + 55667788 = 255667788
 255667788/6 => 0
 0*100000000 + 99001122 = 99001122
 99001122/6=>0

 So the reminder is 0.

操作後の個々のユニットは、int がサポートできる最大範囲を下回る必要があることに注意してください。

于 2014-10-11T15:16:21.887 に答える
0

int の範囲は –2,147,483,648 ~ 2,147,483,647 のみです。データ型の範囲については、http://msdn.microsoft.com/en-us/library/s3f49ktz (VS.71).aspx を確認 してください。ロングロングがおすすめです。

于 2010-03-13T21:37:18.753 に答える