c 關於大數儲存的思路及實現

2021-06-22 18:24:28 字數 2716 閱讀 2426

由於本人並不是什麼專業人士,也不算什麼高手,現在還在上高中,做這些時間不多,而且本人對標準庫了解甚少,只知道一兩個常用的標準庫,(而且英文也不好..),所以設計程式的思路可能非常複雜,僅供參考。

-大數的儲存使用字串實現(類的私有成員)

-對數的操作比較嚴謹且比較多所以封裝成類統一管理

-為了方便格式的統一及後續的計算,定義乙個string::size_type型別的變數用於儲存小數點的位置(這就是所謂的動點了吧)

-同上一點,定義乙個bool型別的變數儲存該數是否大於0(準確點說是有沒有符號)的狀態

-由於有狀態變數需要實時更新,固定義一共有函式update()用於同步上述兩變數的值

-建構函式暫時先設計三種(無引數,string,char(本來還有個double但發現本人對誤差的處理沒轍,所以整數也暫時沒寫))

-因字串不一定符合數字的格式且對數的算數運算及其他處理需要統一格式,故定義一共有函式format()用於格式化字元(大部分情況類本身的操作都會保證資料是經過格式化後的)

-在算數運算和邏輯運算時會經常涉及到單個字元轉數值和數值轉單個字元的情況,所以我編寫了兩個內聯函式(ascii移位實現)

-因涉及到正負數,所以先完成abs()函式用於返回絕對值(不實際修改其本身的值)*由於類的成員經常需要用到 x = x.abs(); 為了方便,定義一私有方法_abs(),修改本身的值為絕對值。

因加減法對於一正一負的問題需要互相轉交且需要判斷兩數的絕對值大小,所以先實現邏輯運算。

我想到的方法是:

對於小於:先判斷兩數符號,若相同再做比較絕對值的操作,最後基於符號返回。

-比較具體過程(絕對值):先將兩數用0補齊到相同位數,再使用迭代器從左往右比較,只要兩指標指向的值不等就可得出結果

然後實現等於:直接比較格式化後的字串

大於:即:既不小於又不等於

不等於:對等於直接進行取反

其他略

加法:先把兩數用0補齊至相同位數,然後按照筆算的規則,從低位開始逐位計算,若遇到符號問題則根據是否一正一負來決定是否交給減法完成。

減法:同上,先補0,再從低位開始逐位計算,並且如果是一正一負則交給加法完成。

乘法:

本人想過3種方法完成(假設是數1(假設100位)*數2(假設也是100位)):

1.按照筆算規則逐位計算(迴圈次數:數1位數*數2位數,10000次)

2.將兩數中位數比較小的小數點向右移位變成整數,然後迴圈這麼多次,每次迴圈結果加上另一數,迴圈結束後結果小數點向左移相同位則得出結果(迴圈次數:位數較小的數的大小,最壞情況99999999.....(100個9)...9999)

3.仍然選擇位數較少的數,不一次性移位變成整數,而是每次迴圈每一位的數的次數得出單次累加結果,然後將單次累加結果向左或者向右移位該位的權重

-例如:25.25 * 42.3

-首先選出位數較小的乙個數:42.3

-然後對每一位進行處理:

-先迴圈4次,每次迴圈給一單次累加變數加上另一數25.25

-迴圈完成後將單次累加變數的小數點向左移1位(乘以10),再將結果累加到最終的累加變數

-然後再迴圈2次,結果不移位(向左移動0位),處理同上

-最後迴圈3次,結果向右移1位(向左移動-1位)

-這樣移位的位數根據數每一位與小數點的相對位置決定(可以一開始就用一變數儲存,然後每次迴圈-1即可)

-迴圈次數(100位):最壞情況(全是9):9*100=900次

所以第三種情況最優,但是今天凌晨我先用第二種情況完成了乘法的運算(2014-7-15)

-(2014-11-4)

重新設計乘法,發現原本的**對於某些數能正常得出結果,而某些就不能,因為當時加入了size的判斷,以保證在最壞演算法的基礎上稍微優化一下下,但當時用的是指標,很低階而且麻煩,現在先不用size用同樣最麻煩的演算法完成了乘法,結果光是對於:3.050505*1.25這樣的計算都要耗費2-3s,而且我又想出乙個判斷size的好方法,直接用一次遞迴就好了...

完成最麻煩演算法後再實現最優演算法(還是先不判斷size),用十幾分鐘的時間從設計到完成**,應該是沒有問題了,經過了簡單的測試,速度明顯提高了許多,但是沒有經過全面的測試,所以改天再進行準確度的測試。

然後完成基於size的運算,用一次遞迴完成。

除法:

還沒有想到最佳方案,看來只能根據實際筆算的方法來了

-另外還有乙個問題就是如果遇到無限小數之類的結果那麼將導致程式陷入死迴圈,所以又增添一私有變數用於儲存除法運算的精度和一共有函式用於修改該值

還沒開始動工..

因乘法需要用到小數點移位,所以我過載了兩個運算子 《和》,用於將小數點移位。

/* strnum.h

* declaration of class "cstrnum"

* * file version:1.3

* date:2014-7-15

*/#ifndef _str_num_

#define _str_num_

#include #include using std::ostream;

using std::string;

class cstrnum

;//get the char of single number.

inline char stochar(short s)

//get the single number of a char with number.

inline short ctoshort(char c)

#endif

c 雜湊演算法的實現方法及思路

有想過hash a1 datetime.now 這句是怎麼實現的嗎?我們來重溫下學校時代就學過的雜湊演算法吧。我們要寫個class,實現如下主程式呼叫 複製 如下 static void main string args n程式設計客棧bsp 一看,也確實挺簡www.cppcns.com單的,就是乙...

關於C 的學習思路

建議根據學習的深度按照如下順序 c 語言程式設計 錢能 清華大學出版社 譚浩強 c 程式設計 thinking in c c primerthe c programming languageeffective c more effective c exceptional c more excepti...

關於c語言的變數儲存及記憶體分配

在計算機裡面,cpu與磁碟 硬碟 是不直接發生資料交換的,因為cpu處理資料的速度遠大於磁碟的速度,因此,在cpu與磁碟之間就有了記憶體這東西的出現,記憶體就是起著乙個緩衝的作用,當執行程式的時候,首先的從磁碟把程式載入到記憶體,然後cpu才能從記憶體裡面取指令以及傳輸資料。但是記憶體是掉電之後裡面...