6

与えられた整数の階乗を評価するプログラムを書くことを考えました。

基本に従って、以下のコードを Java で記述しました。

long fact(int num){
if(num == 1)
 return 1;
else
 return num*fact(num-1);
}

しかし、その後、多くの整数入力の場合、結果が望ましいものではない可能性があることに気付きました。したがって、テストでは入力を100として直接与えました.

得られた結果が「0」だったので、私の疑いは真実でした(結果が長い範囲外である可能性があるため)。

だから、私は自分のプログラムを150以下の入力に対してどのように機能させることができるかを知りたいと思っています。

Cプログラミング言語またはJavaで有効なソリューションをいただければ幸いです。

4

5 に答える 5

13

BigIntegerはあなたのクラスです。一見任意のサイズの整数を格納できます。

    static BigInteger fact(BigInteger num) {
        if (num.equals(BigInteger.ONE))
            return BigInteger.ONE;
        else
            return num.multiply(fact(num.subtract(BigInteger.ONE)));
    }
于 2013-03-04T15:57:08.303 に答える
4

階乗計算の素朴なアプローチを望んでいない場合は、問題について調査する必要があります。以下は、階乗を計算するためのいくつかのアルゴリズムの概要です: http://www.luschny.de/math/factorial/conclusions.html

しかし、他の回答が示唆するように、現在の問題は、固定サイズの整数の代わりに多数の実装 (BigInt など) を使用する必要があることです。

于 2013-03-04T16:00:38.810 に答える
3

C 言語では、配列を使用して大きな数の階乗を格納できます。
私の参照:すべての桁を表示して、任意に大きな数の階乗を計算します。それは非常に役立つ投稿です。
C に変換するためにコードを少し変更しました。

int max = 5000;
void factorial(int arr[], int n){//factorial in array
    if (!n) return;
    int carry = 0;
    int i=max-1;
    for (i=max-1; i>=0; --i){
        arr[i] = (arr[i] * n) + carry;
        carry = arr[i]/10;
        arr[i] %= 10;
    }
    factorial(arr,n-1);
}
void display(int arr[]){// to print array
    int ctr = 0;
    int i=0;
    for (i=0; i<max; i++){
        if (!ctr && arr[i])      
            ctr = 1;
        if(ctr)
            printf("%d", arr[i]);
    }
}
int main(){
    int *arr = calloc(max, sizeof(int));
    arr[max-1] = 1;
    int num = 100;
    printf("factorial of  %d is: ",num);
    factorial(arr,num);
    display(arr);
    free(arr);
    return 0;
}

そして、その作業は100です!参照:こちら コードパッド

さらに 2 つの有用な投稿のリンクを提供したいと思います。
1)任意に大きな整数を処理する方法GPU MP
2)大きな階乗を計算する C++ プログラム

于 2013-03-04T15:58:43.970 に答える
0

10 進数 (基数 10) は約 3.3 ビット (正確には log(10)/log(2)) です。100!は 158 桁の長さなので、158 * 3.3 = 520 ビットが必要です。

これを行うCの組み込み型は確かにありません。階乗計算のすべての桁を「存在」させたい場合は、何らかの形の特別なライブラリが必要です。

を使用doubleすると、おおよその結果が得られます (これは、IEEE-754 互換の 64 ビット浮動小数点値、または同様の範囲の値であると想定していdoubleます。IEEE-754double形式では、約 16 桁の 10 進数 (52 ビットの精度をlog(10)/log(2) 上記のように. この値には16桁以上あると思われるので、正確な値は得られませんが、10桁以上の範囲内の数値を計算します. .

于 2013-03-04T16:17:24.180 に答える
0

Java には、任意の大きな整数を格納できる BigInteger があります。残念ながら、 には同等のものはありませんC。サードパーティのライブラリを使用するか、独自に大きな整数を実装する必要があります。これに対する典型的なアプローチは、動的に割り当てられた配列を使用して、指定された数値の各桁を何らかの数値システムに格納することです (通常、必要な桁数の合計を減らすために、10 を超える基数が選択されます)。

于 2013-03-04T15:58:42.323 に答える