2010-06-23 61 views
3

作爲一個副項目我正在處理一些自制的主要問題,試圖編寫一些不同的實現作爲自學C和C++的一種手段。當然,生成低質數的最快方法是已經擁有它們,所以我想要設置一個硬盤素數列表數據文件。我想編寫所有生成素數的代碼,但我對使用已有的存儲方法沒有任何疑問。在實際編碼方面,我幾乎沒有什麼經驗,但理解了大部分理論。 (注意,對於大多數的這一點,我將談論數學整數,而不是整型變量)無限(或非常高)的長度整數存儲

所以我有一些問題要你們,專家:

1)幼稚的做法也只是二進制 - 在生成它們時寫入整數。然而,在我的腦海中,我想象了一個列表,其中項目由某種標誌分隔,因此可以存儲大於32位的整數(如果我達到該點)。這顯然效率很低,但是數組[4723,12782,8357]的原始數據看起來像4723F12782F8357,即數字以十位數存儲在每十位數字中,並由F分隔。顯然ABCDE數字可能性的數據將不被使用,所以它不是一個非常有效的系統,但你明白我的意思。隨着數字變長,這也會越來越有意義,因爲在任何固定長度系統中,最小的入口必須與最大的入口一樣大。我確定必須有已經用C或C++編寫的東西纔能有效地做到這一點。

2)另一種可能性是一個長度聲明系統,在每個整數存儲之前,一個固定長度的數據(可以說是1個字節)聲明該整數將會變成多長(以位爲單位)。這顯然賦予了與前一種選擇類似的優點,並且不浪費數字可能性。

有誰知道如何去存儲這種數據呢?有沒有可以存儲素數的變量類型,以免碰到大小限制?更好的是,以簡單可檢索的格式將簡單的整數列表存儲到硬盤的最有效方法是什麼?

+0

看看項目歐拉問題的解決方案 - 在那裏處理素數有很多聰明的想法。 – Skilldrick 2010-06-23 14:37:14

回答

5

不要重新發明輪子。如果你處理的是大質數,你幾乎可以肯定需要一個BigNum庫,比如GMP(http://gmplib.org/)。 GMP BigNums具有序列化方法,因此您可以使用它們輕鬆地將它們寫入磁盤並從磁盤讀取它們,讓您可以自由思考該算法。

+0

+1 - 如果你對C++有更多的經驗,我建議將它作爲一種靈感,並自己寫作練習。但是現在,只關注邏輯,否則你很快就會被這個(也可能是其他)圖書館已經被抽象出來的混亂細節所淹沒。 – corsiKa 2010-06-23 15:38:17

+0

謝謝你們!這正是我所期待的。 – 2010-06-23 23:17:36

0

使用在Ubuntu g ++編譯器,我發現,長整型是32位,長長整型64.

我被計算從已知梅森素數完全數,在不同的長整型的長度陣列保持的數字;這意味着您可以在執行長乘法,長分割等時使用long long int作爲臨時變量。我還將每個long中的值限制爲不超過999,999,999,這使得打印答案變得很容易。

+1

如果你處理的素數大於那些適合64位內容的素數,那麼這是行不通的。 – 2010-06-23 15:02:14