この質問が重複して投票されたり、閉じられたりするリスクを冒して、この質問が出てきました。
バックグラウンド
int、long long などの「通常の」データ型では、2 進数の数値を 10 進数の文字列に変換するには、次のようにします (疑似コードで)。
Set length = 0
Set divisor to largest base10 value the data type will hold (Divisor).
Loop
Divide number in question by divisor.
Place result in a string at position length.
Increment the length by 1.
Divide the divisor by 10.
Reverse the string.
Print the string.
(ほとんどの) どの言語でも、実際の実装は非常に簡単です。
問題
上記の方法で私が遭遇している問題は、大きな整数 (任意精度算術とも呼ばれます) では、最初から最大の 10 進数の値がないことです。問題は、「その値が何であるかを知る方法がない場合、除数を可能な限り最大の base10 値に初期化するにはどうすればよいですか?」ということです。
私が試したこと
まだ解決策を下書きしようとしています。
リサーチ
ここで見つけたリンクには、次のようなものがあります。
BigInteger クラスを使用せずに、「大きな」16 進数 (文字列形式) を 10 進数 (文字列形式) に変換します。
BigInteger を 10 進 (Base 10) 文字列に変換する最速の方法は?
BigInteger クラスを使用せずに、「大きな」16 進数 (文字列形式) を 10 進数 (文字列形式) に変換します。
Google で検索すると、他のことがわかりましたが、私の質問に明確に答えるものは何もありませんでした。
アイデア
うまくいくかもしれないと私が思う1つの方法は次のとおりです(疑似コードで):
Define p_divisor as previous divisor.
Set divisor = 1
Loop:
if divisor < dividend
then
Set p_divisor = divisor
divisor = divisor * 10
else
end loop
Loop:
Divide number in question by divisor.
Place result in a string at position length.
Increment the length by 1.
Divide the divisor by 10.
if divisor == 1 then end loop
Reverse the string.
Print the string.
これは正しい方法でしょうか?私は大きな整数ライブラリを稼働させているので(乗算と除算を含む)、これをやってのけるのはそれほど難しくありません。この方法で見られる大きな問題はパフォーマンスです。最初の除数を取得するために乗算シーケンスを実行する必要があり、base10 の位置ごとに 2 回除算する必要があるためです。1 つは実際の除算用で、もう 1 つは除数用です。