分数(103993/33102)を指定すると、この分数の小数点以下 50000 桁を見つける必要があります。
最初setprecision(k)
は C++ で使用しましたが、小数点以下 17 桁しか表示されません。私も試しました
sprintf (str, "%.500000f", num)
しかし、結果は同じです。
これを解決でき、小数点以下を四捨五入しないアルゴリズムが必要です。つまり、正確でなければなりません。
分数(103993/33102)を指定すると、この分数の小数点以下 50000 桁を見つける必要があります。
最初setprecision(k)
は C++ で使用しましたが、小数点以下 17 桁しか表示されません。私も試しました
sprintf (str, "%.500000f", num)
しかし、結果は同じです。
これを解決でき、小数点以下を四捨五入しないアルゴリズムが必要です。つまり、正確でなければなりません。
このような問題を解決する方法を見つける最良の方法は、途方もなく簡単な問題を取り上げて、そのアルゴリズムを理解することです。そうすれば、混乱したり場所を失ったりすることはなく、アルゴリズムは問題に関係なく同じです。だから取りましょう4/3
。
4は1回3になります。残り1個です。一度入ったものを出力1.
します。残りの1つはそのままにしておきます。
残った1に10を掛けて、10を求めます。3(分母)は10に3回入ります。1つ残っています。
3
3回入ったので出力しました。まだ1つ残っています。
手順2に進み、必要な回数だけ繰り返します。
この同じアルゴリズムは、分子と分母が正の整数である限り、分子と分母に関係なく、これだけで機能します。
float や double は精度が十分でないため、実行できません。bignum ライブラリの使用を提案する人もいます。これは実行できますが、整数を直接操作する別の方法があります。
この問題を解決するには、累乗剰余と呼ばれる手法を使用できます。これにより、精度の問題に遭遇することなく、すべての桁を計算できます。
幸いなことに、これを行う方法の答えはすでに書かれています: