兩個大數相加

2021-08-10 22:06:51 字數 1709 閱讀 8257

我們以前計算兩個整數的和,需要定義兩個整型變數來儲存兩個運算元。

但是,若這兩個數大到任何整型型別都存放不下時,我們該怎麼來計算它們的和呢?這就是我們今天所討論的話題!

解決思路:

(1)、儲存問題:我們可以使用字串來儲存運算元,這樣不管運算元有多長都能放得下。

(2)、計算問題:自定加法時,我們要考慮每一位的相加,還有相加時是否有進製值產生。若產生進製,則要在下一位相加時加上進製值。

(3)、儲存結果:兩個數相加的結果的位數肯定小於等於兩個數的較長的數的位數+1,因為要考慮的最高位進製。即:

結果的位數 = (運算元1位數  > 運算元2位數 ?  運算元1位數 : 運算元2位數) + 1;

(4)、輸出問題:這是最簡單的問題,因為申請的結果位數可能大於真正的結果的位數。所以第乙個字元可能為空字元'\0', 所以輸出是應把它跳過。

好,思路理清了。開始寫**:

寫**時遇到乙個問題:釋放所申請的結果的記憶體時出現釋放錯誤

但是我感覺並沒有超界,但是沒辦法。用最笨的辦法:

將記憶體申請的大一些。所以我的結果位數比原來的大了乙個位元組,你們在**中是可以看到的。然後程式就可以正常執行了!

源** :

#include#include#include/*

**功能: 從鍵盤獲取加法運算元的輸入

**引數說明: 無引數

**返回值: 輸入的運算元儲存位置的指標

*/char *getoperinput()

/***功能: 將兩個字串形式的整數相加,得到結果

**引數說明:

**@paddresult: 儲存加法結果;

**@poperone: 儲存加法第乙個運算元 @popertwo: 儲存加法第二個運算元 (兩個運算元不可更改)

**返回值: 無

*/void getresult(char **paddresult, int resultlength, const char *const poperone, const char *const popertwo)

else

(*paddresult)[resultlength] = addvalue + '0';

lenone--;

lentwo--;

resultlength--;

} //如果哪乙個運算元剩下未相加的位,直接加到結果中

while (lenone >= 0)

lenone--;

resultlength--;

} while (lentwo >= 0)

lentwo--;

resultlength--;

} //如果有最高位進製的話

if (carryvalue) }

int main(void)

puts(presult);

//收尾工作

free(poperone);

poperone = null;

free(popertwo);

popertwo = null;

free(paddresult);

paddresult = null;

return 0;

}

執行截圖 :

兩個大數相加

兩個大數相加,暫時選擇簡單版本,使用兩個正整數相加,直接上 了,不再囉嗦了。include define maxnum 10000 bool inspectcharvalid char value void add char num1,char num2,char result int main i...

兩個大數相加

大數相加考慮到資料長度有限,因此採用字串的方式進行計算,還要考慮到進製的問題,看下 void big data add char num1,char num2 int intnum2 max len if num1 null num2 null length1 strlen num1 length2...

兩個大數相加

前言我們知道在計算機語言中數字的表示範圍都是有限制的,例如我們熟知的int,float,double,long int,long long int等這些型別表示的數字範圍都是限制的。如果我們要對位數達到幾百位,上千位,甚至上萬位大的整數進行計算,這些型別顯然不能實現,因此我們可以用一些演算法來實現這...