1

GNU Multiple Precision (GMP) ライブラリを使用して、任意精度の整数に対していくつかの計算を実行しています。次に、結果の 10 進数が必要です。しかし、それらのすべてではありません: たとえば、100 桁の最上位桁 (つまり、数字が始まる数字) または数字の中間から選択された範囲の数字 (たとえば、1000 の数字 100..200) -桁数)。

GMPでそれを行う方法はありますか?

ドキュメントには、10 進数の範囲を文字列として抽出する関数が見つかりませんでした。mpz_t文字列に変換する変換関数は、常に数値全体を変換します。基数のみを指定できますが、開始/終了桁は指定できません。

数字全体を巨大な文字列に変換して、その一部だけを取り出して残りを捨てる以外に、それを行うより良い方法はありますか?

編集:私が必要とするのは、数値の精度を制御したり、特定の固定桁数に制限したりすることではなく、任意の精度の数値の桁文字列から桁のサブセットを選択することです。

必要なものの例を次に示します。

7 1316831 = 19821203202357042996...2076482743

実際の番号は 1112852 桁で、これを に縮小しました...
今、私が必要としているのは、この膨大な数の文字列から任意に選択された部分文字列だけです。たとえば、最上位10桁 (1982120320この場合)。または、1112841番目から 1112849番目までの数字(21203202この場合)。または、1112841番目の位置 (2この場合) の 1 桁だけです。

最初に GMP 番号を 10 進数の文字列に変換する場合mpz_get_str、これらの数字のごく一部を使用して残りを破棄するために、これらの数字に膨大な量のメモリを割り当てる必要があります。(言うまでもなくmpz_t、バイナリ表現の元の数はすでにかなりの量を消費しています。)

4

2 に答える 2

1

x = 7^13168311112852 のように、事前にの 10 進数の桁数がわかっている場合は、次のようにして下位の 10 桁を取得します。

x % (10^10)、および上位 20 桁は次のとおりです。

x / (10^(1112852 - 20)).

注意してください、私19821203202357042995は後者を理解しています。5最終的には、ありません6

于 2015-01-27T11:25:46.020 に答える