[英]Java: How to solve a large factorial using arrays?
我可以在網上找到的所有解決方案都使用BigInteger
但我必須使用數組來解決這個問題。
我只是一個初學者,我什至把它帶到了我的計算機科學俱樂部,甚至無法弄清楚。
每次輸入大於31
的數字時,輸出始終為零。
此外,當我輸入一個大於12
的數字時,輸出總是不正確的。
例如, fact(13)
在它應該返回1932053504
時返回6227020800
這是我到目前為止所擁有的:
import java.util.Scanner;
class Fact
{
public static void main(String[] args)
{
Scanner kb = new Scanner(System.in);
System.out.println("Enter the number you wish to factorial");
int x = kb.nextInt();
System.out.println(fact(x));
}
public static int fact(int x)
{
int[] a = new int[x];
int product = 1;
for(int i = 0; i < a.length; i++)
{
a[i] = x;
x--;
}
for(int i = 0; i < a.length; i++)
{
product = product * a[i];
}
return product;
}
}
最大值使大數變得可怕
可悲的是,由於integers 和 longs的最大值,您無法大於
對於多頭:
2^63 - 1
9223372036854775807
9 quintillion 223 quadrillion 372 trillion 36 billion 854 million 775 thousand 807
對於整數:
2^31 - 1
2147483647
2 billion 147 million 483 thousand 647
(我把寫的名字放進去顯示尺寸)
在計算過程中的任何時間點,您都會查看這些“最大值”,您將溢出變量,導致它的行為與您預期的不同,有時會導致形成奇怪的零。
甚至BigInteger
也有這個問題,盡管它可以上升到比longs
和ints
高得多的數字,這就是為什么它們與生成大量數字(如階乘)的方法一起使用的原因。
你似乎想避免使用BigInteger
,只有使用primatives這么long
將成為最大的數據類型,您可以使用。
即使您將所有內容都轉換為long
(當然除了數組迭代器),您也只能准確計算最多 20 的階乘。 任何超過的東西都會溢出變量。 這是因為21! 超過多頭的“最大值”。
簡而言之,您需要使用BigInteger
或創建自己的類來計算大於 20 的數字的階乘。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.