簡體   English   中英

如何編寫解決方案以處理大量數字?

[英]How to Code a Solution To Deal With Large Numbers?

我正在做一些歐拉計畫的問題,並且在大多數時候,計算涉及除int,float,double之外的大量數字。

首先,我知道我應該尋找更有效的計算方法,以避免出現大量問題。 我聽說過Bignum庫。

但是,出於學者的利益,我想知道如何編寫自己的解決方案。

有專家可以幫我嗎? (我的語言是C)

您需要將大數字存儲在計算機可以用其本機類型輕松處理的基數中,然后將數字存儲在可變長度數組中。 我建議您為簡單起見,首先將數字存儲在以10為基數的表格中,以了解如何執行此操作。 這將使調試變得容易得多。

一旦有了可以以這種形式存儲數字的類,就可以在該類上實現加,減,乘等運算。 每個操作都必須遍歷其操作數的位數並進行組合,請小心正確地進行攜帶,以使您的位數永遠不會大於基數。 加減法很簡單。 乘法需要更多的工作,因為朴素的算法需要嵌套循環。 然后,一旦完成工作,就可以嘗試以有效方式(例如重復平方)實現求冪。

如果您打算編寫一個嚴肅的 bignum實現,那么以10為底的數字將不會減少它。 它浪費了內存,而且速度很慢。 您應該選擇計算機的自然基准,例如256或字長(2 ** 32)。 但是,這會使簡單的操作變得更加困難,因為如果天真地將兩位數字相加,將會溢出,因此您需要非常小心地進行處理。

對於Euler項目來說,C不是一個好的選擇 C的好處是原始速度,機器可移植性(在某種程度上,使用標准C),語言互操作性(如果某種語言與另一種語言進行通信,則C是流行的首選),緊貼特定庫或平台的API(因為C很常見,例如OS API),以及穩定的語言和stdlib。 這些好處均不適用於解決Euler項目問題​​。 甚至沒有原始速度,因為大多數問題都不是原始計算,而是了解所需的算法,您可以整日坐在那里等待提交之前。

如果您試圖通過Project Euler問題來擴展C的使用經驗,那完全沒問題,只是要意識到這種經驗並不一定適用於您可能會從事的長期且真實的C項目。

對於這種簡短的一次性問題,那些通常被稱為“腳本語言”的語言將更好,更快(在開發時間內)且更容易工作。 嘗試使用Python,它在許多方面都接近C,包括C API,並且在各種流行的“腳本語言”中,您可能會發現與C項目結合使用最多的一種。

這可能會成為一個不受歡迎的答案,但這不是一個大問題-再加上我真的很喜歡C,並且經常使用C / C ++-並且這里有一個明確的答案可以解決您的問題:“不要使用C”,最后一個數字解決方案,取決於您選擇的替代方案。 再次選擇Python,整數沒有上限(下面有注釋),我用它自然地編碼了Euler項目問題​​的答案,而在其他語言中,我必須使用比較痛苦的替代數字庫。

Python整數: 2.x中有兩種整數類型,“ int”和“ long”(在3.x中已完全統一)。它們之間的轉換實際上是無縫的,而“ long”則允許任意大的值,而不是像C的long那樣成為更大的'int'類型。)

用於C / C ++的流行的bignum庫是GNU MP Bignum庫 我已經將它用於幾個Euler項目問題​​,但事實仍然是C對於Euler問題不是很合適的語言。 如果性能更重要,則C可以提供更多的性能,但是現在,使用內置於bignum支持的語言(例如Ruby)會更好得多。

一種簡單的方法是將數字視為以b為基數的字符串表示形式。 假設b = 10,可以使用與筆和紙相加數字時所使用的相同方法來完成簡單的算術運算,例如對兩個這樣的字符串進行加法。 其他簡單操作也是如此。 為了獲得更好的結果,您可以采用更大的基數。

像這樣的簡單bignum實現足以解決大多數Project Euler問題(可能是所有問題,但我在Euler並沒有解決很多問題,所以不能確定),但是有一些方法可以使用更快的算法進行乘法和乘法運算。部門/國防部

盡管我建議您編寫自己的bignum進行練習,但是,如果您確實遇到困難,可以從已經實現的bigint庫的代碼中汲取靈感。 對於嚴重的實現,諸如gmp之類的選擇是顯而易見的選擇。 但是當在線解決類似的練習問題時,您也可以找到其他人編碼的小bigints(例如Abednego的bigint.cpp )。

這是一個不錯的C簡單bignum模塊。您可以從中學習想法。 C代碼不是最高質量,但是該算法實現良好且相當普遍。

有關更高級的內容,請查找GMP。

如果您想要一個不錯的C ++版本(我知道,您說的是C,但這確實是有趣的代碼),請看一下CGAL的內部知識: http ://www.cgal.org/

我完全同意Roger Pate的觀點。 我見過很多次人們遇到C / C ++ / Java的整數極限問題,但是對於Python,這不是問題。 對於大多數Project Euler問題,提出正確的算法至關重要,而從C語言獲得的性能將無關緊要。 此外,有了Python中可用的關聯數據類型,字典,集合等以及一些內置庫itertools,僅此而已,解決Python問題的速度要快得多。 自從加入Euler項目之后,我就開始認真學習Python,並且對自己的決定感到滿意(我的第一語言是C ++,第二語言是Perl,但是我想學習Python)。

暫無
暫無

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

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