6

こんにちは、これは階乗の方法ですが、コンソールに0が出力されます。ありがとうございます。

public class Demo {

    public static void main(String[] args) {
        Demo obj = new Demo();
        System.out.println(obj.factorial(500));
    }

    public int factorial(int n) {
        int fact = 1;

        for (int i = 2; i <= n; i++) {
            fact= fact*i;
        }
        return fact;
    }

編集済み:インフィニティを返します!

public class Demo {

    public static void main(String[] args) {
        Demo obj = new Demo();
        System.out.println(obj.factorial(500));
    }

    public double  factorial(long n) {
       double fact = 1;

        for (int i = 2; i <= n; i++) {
            fact= fact*i;
        }
        return fact;
    }
}
4

6 に答える 6

19

500!等しいので、 (までの範囲)1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000に適合させることはできません。int2147483647

  • を使用すると、int最大で保存できます12!
  • を使用するlongと、20!
  • を使用すると、doubleになります170!

これが使用する解決策BigIntegerです:

public static BigInteger factorial(int i) {
    BigInteger n = BigInteger.valueOf(i);
    while (--i > 0)
        n = n.multiply(BigInteger.valueOf(i));
    return n;
}
于 2010-10-11T11:20:09.240 に答える
4

500!32ビットに収まる方法はありませんint

大きな数を含む計算の場合は、近似または正確な答えが必要かどうかに応じて、doubleまたはを使用することを検討してください。BigInteger

(実際には、のため500!に、でもdouble十分ではありません:Double.MAX_VALUE1.7976931348623157E + 308であり、これは「のみ」まで上がることができます170!

于 2010-10-11T11:15:18.450 に答える
2

階乗関数を計算する必要がある場合は、次の2つのことを調べる必要があります。

1)メモ化。階乗関数には再帰的定義があるため、これにより計算が劇的に高速化されます。以前の計算をキャッシュするので、要求したときに、キャッシュしたかどうかを計算するk!ことで、1つのステップでそれを取得できます。k*((k-1)!)(k-1)!

2)スターリングの近似。大きな階乗を計算する必要がある場合は、この方法で非常に迅速に近似でき、誤差の範囲が保証されているため、アプリケーションに対して近似が許容できる程度に近いかどうかを判断できます。

これらのどちらも行わない場合、妥当な時間内にk単純に計算できない比較的小さいものがあることがわかります。k!

于 2010-10-11T13:06:15.650 に答える
0

Grodriguezは正しいです-これはほぼ確実に整数のオーバーフローが原因です。

より控えめな入力でメソッドをテストすると、正しい出力が返されるように見えます。

public static void main(String[] args) {
   Demo obj = new Demo();
   for (int i = 0; i < 10; i++)
      System.out.println(i + "! = " + obj.factorial(i));
} 

500!巨大です; 関数をテストするときは、小さい入力から始めるのが賢明です。

于 2010-10-11T11:19:44.840 に答える
0

500!大きすぎて長い、または2倍に収まりません
これを取得するには、他の手法を使用する必要があります。

しかし、最初に、どのようなプログラムが必要500!ですか?

于 2010-10-11T11:22:30.920 に答える
0

因数分解の実装には、いくつかの非常に優れた最適化があります。たとえば、Javaでのそれらの優れた実装については、luschny.deを参照してください。他のものよりも数学的な洞察を必要とするものもあります...ライブラリを楽しんでください:-)

于 2010-10-11T13:39:29.363 に答える