3

250より大きい数値の階乗が必要なため、文字列を使用して階乗プログラムを実行しています

私は意図します:

string factorial(int n){
    string fact="1";
    for(int i=2; i<=n; i++){
        b=atoi(fact)*n;

    }

}

しかし問題は、atoi が機能しないことです。文字列を整数に変換するにはどうすればよいですか。

そして最も重要なのは、この方法のプログラムがたとえば 400 の階乗で機能するかどうかを知りたいですか?

4

9 に答える 9

3

階乗を計算する Web サイトがあります: http://www.nitrxgen.net/factorialcalc.php。それは報告します:

結果の階乗は 250 です! 長さは 493 桁です。結果には、62 個の末尾のゼロも含まれます (これは、全体の 12.58% を構成します)。

323285626090910773232081455202436847099484371767378066674794242711282374755511120948881791537102819945092850735318943292673093171280899082279103027907128192167652724018926473321804118626100683292536513367893908956993571353017504051317876007724793306540​​2339006164825552248819436572586057399222641254832982204849137721776650641276858807153128978777672951913990844377478702589172973255150283241787320658188482062478582659808848825548800000000000000000000000000000000000000000000000000000000000000

C++ を使用する多くのシステムdoubleは、1E+308 程度までしか動作しません。250の値!このような数を格納するには大きすぎます。

stringしたがって、C++値を使用して独自に考案した、または他の広く使用されている多精度ライブラリ (GNU GMPなど)を使用して、ある種の多精度演算ライブラリを使用する必要があります。

于 2013-06-29T22:32:53.760 に答える
0

階乗は int への変換に依存しているため、かなり高速にオーバーフローするため、大きな階乗をそのように計算できるようにする必要があります。大きな数の計算を適切に実装するには、紙の計算と同じようにロジックを実装する必要があります。これは、小学校で教わったルールですが、long long int を個々の数字ではなく「アトム」として扱います。文字列に対しては行わないでください。非常に遅くなり、厄介な変換でいっぱいになります。

于 2013-06-29T22:15:27.267 に答える
0

c_str() を追加することで atoi をコンパイルできますが、階乗になるまでには長い道のりが必要です。現在、あなたの周りにはbがいません。持っていたとしても、int に int を掛けます。そのため、最終的に返す前にそれを文字列に変換したとしても、範囲は依然として制限されています。実際に ASCII で乗算を開始するか、bignum ライブラリを使用するまで、文字列を使用する意味はありません。

于 2013-06-29T22:11:21.880 に答える
0

C++ では、最大の整数型は 'long long' であり、64 ビットのメモリを保持するため、明らかに 250 を格納することはできません! 整数型で。文字列を使用するのは賢明なアイデアですが、基本的にコードで行っていることは (私は atoi() 関数を使用したことがないため、1 文字を超える文字列でも機能するかどうかはわかりませんが、関係ない):

  1. 文字列を整数に変換します (このコードがうまく機能した場合、一瞬で 249 の値を含む文字列になります!)
  2. 文字列の値を掛けます

したがって、乗算が完了したら、整数を文字列に戻すことさえしません。そして、それを行ったとしても、文字列を整数に変換し直すと、整数が文字列の値を保持できないため、プログラムがクラッシュします。

私の提案は、大きな整数に何らかのクラスを使用することです。残念ながら、C++ で利用できるものはありません。そのため、自分でコーディングするか、インターネットで見つける必要があります。でも、自分でコーディングしても、少し考えればそんなに難しくないので安心してください。文字列を使用してアイデアを使用することもできます。これは、この問題の場合でも最善のアプローチではありませんが、メモリをあまり使用せずに、必要な時間内に結果が得られます。

于 2013-06-30T01:56:52.293 に答える
-1

ロジックは次のようになります。

unsigned int factorial(int n)
{
    unsigned int b=1;
    for(int i=2; i<=n; i++){
        b=b*n;
    }
    return b;
}

ただし、b がオーバーフローする可能性があります。したがって、より大きな整数型を使用できます。または、不正確ですが、はるかに大きな数値を保持できる浮動小数点型を使用できます。しかし、どの組み込み型も十分に大きくないようです。

于 2013-06-29T22:14:59.850 に答える