-2

double を使用してみましたが、3.2e+12 のような科学的な答えが得られます。適切な答えが必要です。どうすればそれを行うことができますか??

これまでの私のコード:

    int n, x;
    double fact;
    cin>>n;

    while(n--)
    {
        fact=1;
        cin>>x;
        for(;x>1;x--)
            fact*=x;
        cout<<fact<<endl;
    }
4

3 に答える 3

1

まず最初に、double や float などの浮動小数点形式を使用すると、常に丸め誤差が発生します。大きな数値で誤差を減らしたい場合は、long または long long を使用しますが、これらは double や float ほど大きな値を表すことができません。 long double (long long と long double の動作とサポートはコンパイラによって異なることに注意してください)。プリフォームを犠牲にしますが、bigint や bigdouble のような BigNum を調べたいと思うかもしれません。

とはいえ、この問題は書式設定の設定の 1 つでもある可能性があります。数値が十分に大きいため、科学表記法で出力されます。これを変更するには、使用できます

cout<<std::fixed;

C++ cout を科学表記法を使用しないようにする方法の重複の可能性

于 2013-10-09T12:34:44.150 に答える
0

これほど大きな数 (100!) を格納できるデータ型は今のところありません。100! を計算するには、BigIntenger クラスのようなものを終了する必要があります。そして通常、そのような大きな数は文字列で格納できます。

于 2013-10-09T13:02:56.947 に答える
0

double固定サイズの型で、通常は 64 ビットで、精度は 53 ビットです。そのため、約 16 桁を超える整数を正確に表すことはできません。最大の標準整数型は通常 64 ビットで、最大約 19 桁の整数を表すことができます。100!はそれよりもはるかに大きいため、組み込み型では正確に表すことができません。

数値を小さい数値の配列として表す大きな整数型が必要になります。標準タイプはありません。Boost.MultiprecisionGMPなどのライブラリを使用するか、これはプログラミング上の課題であるため、自分で実装することができます。階乗を計算するには、乗算を実装する必要があります。これを行う最も簡単な方法は、学校で学んだ「長い乗算」アルゴリズムを使用することです。

于 2013-10-09T12:29:20.773 に答える