2015-09-26 39 views
-1

我有一些方法可以找到一個大數的因式。有人可以解釋,它有什麼問題,爲什麼我沒有任何輸出?找到一個喜歡的大數

public static long factorial(long num) { 
    BigInteger numm = BigInteger.valueOf(num); 
    BigInteger fact= BigInteger.valueOf(1); 
    for (; numm.compareTo(BigInteger.ZERO)==1 ; fact = fact.multiply(numm)) { 
     numm.subtract(BigInteger.ONE); 
    } 
    return fact.longValue(); 
} 
+0

你放棄你的相減(?注意你怎麼寫'其實= fact.multiply(numm)'乘法運算後更新'fact')的結果,這意味着' numm'將始終是相同的值,並且循環將繼續「永遠」。 –

+0

[在Java中查找大數的階乘]的可能的重複(http://stackoverflow.com/questions/11446973/find-factorial-of-large-numbers-in-java) – Joe

回答

0

您不會將減法值分配給numm。這就是問題。 要繼續使用您的代碼,請使用num + 1,因爲for循環的最後一部分在執行減法後執行。所以,需要一個額外的迭代。

檢查:

long num=5; 
BigInteger numm = BigInteger.valueOf(num + 1); 
BigInteger fact= BigInteger.valueOf(1); 
for (; numm.compareTo(BigInteger.ONE)==1 ; fact = fact.multiply(numm)) { 
    numm = numm.subtract(BigInteger.ONE); 
} 
System.out.println(fact.longValue()); 
+0

非常感謝你,我的問題是肯定的'numm'分配 – user3545646

0

我不認爲這就是你寫一個階乘。爲什麼您在退回long時使用BigInteger?所以只需做出決定,即longBigInteger。我會選擇BigInteger,因爲你說你想操作非常大的數字。你應該使用遞歸來進行階乘。

public BigInteger factorial (BigInteger number) { 
    if (number.equals(BigInteger.ONE) || number.equals(BigInteger.ZERO)) { 
     return BigInteger.ONE; 
    } 
    return number.multiply(factorial(number.subtract(BigInteger.ONE))); 
} 
+0

階乘是顯示遞歸基礎知識的好例子,但通常如果有一個不需要遞歸的非常好的算法,我們爲什麼要使用它? –