2017-04-19 19 views
0

5! = 5 * 4 * 3 * 2 * 1。javaで非整数値の階乗

私はこれに問題ありません。しかし私は私のプログラムで、もし私が3.5とタイプすれば気づいた!定義された番号を返します。

どのように計算しますか?

私は私のプログラムではこのようなものを持っている

public class fact { 
    public static void main(String args[]) { 
    double factorial=1; 
    System.out.println("Type a number"); 
    double number= sc.nextDouble(); /*I am using scanner*/ 
    while (number !=0){ 
     factorial = factorial * number; 
     number--; 
    } 
    System.out.println(factorial); 
    } 
} 
+0

私はあなたの問題をよく理解していませんか?もう少し詳しく説明できますか? – Koekje

+0

このリンクを参照してくださいhttps://math.stackexchange.com/questions/454053/how-do-we-calculate-factorials-for-numbers-with-decimal-places – tabby

+0

階乗関数は整数に対してのみ定義されています。 3.5を入力として受け入れる理由は何ですか? – jsheeran

答えて

2

事はある:階乗全体、正番号の非常に単純です。

概念はでもを浮動小数点数に適用できますが、その背後にある数学はadvancedと考えることができます。

So:ステップバック。概念の背後にある数学を理解してください。コンセプトを実装する前に!

つまり、あなたはあなたのプログラムをintの数字(> 0になることが確認されている)で動作するように変更するつもりかどうかを決めなければなりません。または浮動小数点数を許可する予定の場合。後の方があなたの目標であれば。あなたの単純な実装はこれ以上行いません。

それ以外では、最初にのという浮動小数点数の概念を勉強したいと考えています。代わりにint型/ロングの浮動小数点数を使用している場合

double number = ... 
while (number !=0) { 
    .. 
    number--; 
} 

のようなループは常に停止すると仮定すること誤解です!逆に...

5

ファクトリゲーションは、正の整数に対してのみ定義されています。実数の階乗を計算する場合は、ガンマ関数をご覧ください。

https://en.wikipedia.org/wiki/Gamma_function

+1

これは正に正しい答えです!ガンマ関数は二重の階乗を計算することを可能にします... –

0

あなたのコードは、次のように計算しますので、あなたは!でも3.5に定義された値を取得している:

1*3.5*2.5*1.5*0.5 

しかし、実際には3.5のために間違った値です!正しい値は11.6317283966です。あなたのメソッドは、整数入力に対してのみ有効です。小数階乗の詳細についてはこれを参照してください: this link

+0

実際には、OPのコードは 'number!= 0'をチェックするので、そこでは停止しません。 – Hulk

関連する問題