簡體   English   中英

Java:如何使用數組解決大型階乘?

[英]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也有這個問題,盡管它可以上升到比longsints高得多的數字,這就是為什么它們與生成大量數字(如階乘)的方法一起使用的原因。

你似乎想避免使用BigInteger ,只有使用primatives這么long將成為最大的數據類型,您可以使用。

即使您將所有內容都轉換為long (當然除了數組迭代器),您也只能准確計算最多 20 的階乘。 任何超過的東西都會溢出變量。 這是因為21! 超過多頭的“最大值”。

簡而言之,您需要使用BigInteger或創建自己的類來計算大於 20 的數字的階乘。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM