2013-04-04 40 views
1

我在研究計算機工程,我們有一個艱鉅的任務。不使用大整數庫的因子算法

我們必須開發一個C#應用程序,它可以計算真實大數的階乘,而不需要BIGINT。我的意思是非常大的數字,如123564891 ... 82598413!。我們不必使用許可來使用自定義庫(如BIGINT)。

其研究之,發現像這樣的一些問題,但這個問題比其他人因爲我們沒有任何自定義庫計算非常大的數字不同。我發現PoorMans Algorithm。但它的計算高達10000。這對我們來說還不夠。

隨着我的隊友,我們找到了解決辦法。假設我們將得到123的階乘。我們將得到123作爲字符串。然後,我們將總結123,122次(它等於123×122)。然後總結121次。它會像這樣直到達到1.所以,我們將總結兩個字符串。

我們創建了一個求和字符串的算法。我們將第一個數字的最後一個字符(123中的3)作爲整數(我們可以使用整數,但不是bigint)。並獲得第二個數字的最後一個字符爲整數(122的2)。總結他們並找到結果編號的最後一個字符(結果= x ... x5)。我們將從最後一個字符到第一個字符。最後,我們將獲得結果編號。但是如你所知,我們應該使用while()或for()循環,爲了使用這個循環,我們需要再次使用bigint。

String number = "9878945647978979798798797189"; //we will get factorial of this 
for(int i = 0;i < number.Length; i++) 
{ 
    // sum all chars one by one 
} 

我們不能用這樣的循環,因爲i變量將超過整數的範圍內,我們會得到錯誤。所以我們必須在這裏使用bigint。我希望我解釋它。

現在在這裏我的問題,用於創建算法的演練,可以在不使用BIGINT的情況下計算真正大數的階乘。

這是程序員的問題,而不是Math.stackexchange.com的問題,因爲我需要的程序化的回答,直接演練。如果我在數學網站上提出這個問題,他們會給我這個列表:http://www.luschny.de/math/factorial/FastFactorialFunctions.htm。可能他們不會理解我的'BIGINT問題'。

+14

我認爲這個練習是要求你寫你自己的bigint庫。 – 2013-04-04 22:55:44

+0

您是否明白數字的增長速度非常快,您甚至無法在例子中存儲您的號碼的所有數字。這也需要很長的時間。 – Andrey 2013-04-04 22:59:01

+0

@安德烈,正好!這就是問題所在:)因此,我們的應用程序將包含一個計時器,我們將向用戶顯示它花費了多少秒。也例如,我們將存儲123的結果!當用戶問124!我們將直接使用124 * 123! 。 – Eray 2013-04-04 23:01:04

回答

4

您必須編寫自己的大整數庫。檢查Knuth第2卷以開始。

你的預期看起來有點...過分熱情。你會而不是無論你做什麼,都能夠計算出9878945647978979798798797189的階乘。

+0

是的,它有點過分熱情,我的意思是程序不應該有任何限制。 – Eray 2013-04-05 11:44:15