1

このプログラムを実行するためのより効率的な代替案を提案してください

#include <stdio.h>

int main(void)
{
    int k, i, t;
    int arr[100]; //Declaring an array

    printf("Enter a positive integer: ");
    scanf("%d", &k);

    for (i = 0; i < k; i++)
    {
        //printf("enter a value %d : ", i);
        scanf("%d", &arr[i]);
    }

    for (i = 0; i < k; i++)
    {
        fact(arr[i]);
    }

}

int fact(int num) // defining function fact(Num)
{

    int i;
    int fact1 = 1;

    for (i = 1; i <= num; i++)
    {
        fact1 = fact1 * i;
    }

    printf("%ld\n", fact1);

}
4

4 に答える 4

5

小さな議論については、Hamish Grubijanのコメントに同意します。値を表にして、実行時に調べてください。n!の値はそれほど多くありません。はマシン番号で表すことができるので、それらすべてを表にすることができます。

nの対数!多くの場合、より便利です。nのときはマシン番号の中に収まります!それ自体がオーバーフローします。対数階乗の計算方法を参照してください。

于 2010-08-28T15:31:03.390 に答える
1

スターリングの公式は、大きな階乗の近似として使用できます。非常に大きな正確な階乗が必要な場合は、bignum演算を使用する必要があります。漸近的に最高の効率は、nを計算することによって得られます!その素因数分解から。その他のアルゴリズムについては、これを確認してください

于 2010-08-28T14:56:45.557 に答える
0

スターリングの近似を使用して、大きな数の階乗を計算できます。

于 2010-08-28T14:55:18.650 に答える
0

Fast Factorial FunctionsのWebサイト、およびFactorialWikipediaの記事のComputationセクションを参照してください。

于 2010-08-28T15:13:09.900 に答える