0

0 から 16 までの階乗数を計算する関数を作成しました (負の数はなく、適度に小さい)。

しかし、n15を超えることはありません。どのデータ型をどこで使用する必要があるのでしょうか?

long factorial(long num1)
{
    long f;

    if (num1 >= 0 && num1 <= 16)  
    {
        for (long i = 0; i <=num1; i++)
        {
            if (i==0) f = 1;
            else f=f * i;
        }
        return f;
    }
    return 0xFFFFFFFF;
}
4

3 に答える 3

2

32ビットシステムを使用していると思いますが、それ以外の場合は機能します。

32 ビット整数で表現できる最大数は 2^31 です (符号のために少し保存する必要があります)。

アーキテクチャによっては (この情報なしでは質問に答えることができません)、alongが 32 ビットに格納される可能性があるため、16 を正確に表すことができません! 2^31より大きいからです。

コンパイラ/アーキテクチャの特定の拡張機能を探して、64 ビットのストレージを保証します (標準では保証されていません。これは、型に必要なビット数を指示するものではなく、型のストレージ サイズ間の不等式を設定するだけです)。

于 2013-03-03T07:22:45.257 に答える
1

longに変更long long:

long long factorial(long num1)
{
    long long f;
    //....
}
于 2013-03-03T07:23:42.553 に答える
0

ライブラリgmplibを調べてみてください- 非常に大きな数を保存して使用できるようにする必要があります

于 2013-03-03T07:29:53.720 に答える