大數減法運算
第一次在csdn寫部落格,督促自己不斷學習、鞏固和進步,希望能和大家一起成長~
在程式設計實現整數運算時,作為程式猿/媛,我們知道計算機中的int、long或者long long的所佔的記憶體空間是有限的,當整數超過一定大小,這些型別就無法表示整數的值,否則資料會被「截斷」,無法得到正確的結果。
那麼,該如何實現大數運算呢?剛開始我也是如此的疑惑,但稍加思索,你很快可以想到最簡單的方法——使用int陣列(或者char陣列,既滿足要求,又可節省空間)來進行運算。假設有兩個大數,char *s1 = "4543636436274354646", char *s2 = "456360989", 我們可以取出每一位的值,放到int陣列。
值得注意的是,char *中低位址存放的是高位的數字字元,而運算中我們需要將低位對齊,所以首先將字串的字元逆序存入陣列中, 個位數是陣列第乙個元素:
int idx, len1, len2, *array1, *array2;
len1 = strlen(s1);
array1 = (int *)calloc(len1, sizeof(int));
for (idx = 0; idx < len1; idx++)
照此將s2的數字存到array2中,簡單起見,這裡假設array1表示的數字大於等於array2表示的數值。接著就是按照減法的定義,被減數當前位小於減數,則向高位借1,自身加10,邏輯如下:
for (idx = 0; idx < len2; idx++)
}array1[idx] -= array2[idx];
運算結束後,需要將結果以字串形式返回。這裡有一點很容易被忽略,陣列中最高位的0需要清除,不顯示到結果的字串中。
方法同樣很簡單,從array1最大的元素開始遍歷,直到第乙個不為0的數字,該位置及之前的陣列元素即為運算結果。
最後,還需注意將陣列的元素值 + 『0』,並逆序寫到字串中,注意將字串儲存結果後的一位賦值'\0',表示結束,得到正確的結果。完整**如下:
/**
* the value of s1 is larger than s2 */
char *sub(const char *s1, const char *s2)
len1 = strlen(s1);len2 = strlen(s2);
if (0 == len1 || 0 == len2)
array1 = (int *)calloc(len1, sizeof(int));if (null == array1)
array2 = (int *)calloc(len2, sizeof(int));
if (null == array2)
result = (char *)calloc(len1+1, sizeof(char));
if (null == result)
for (idx = 0; idx < len1; idx++)
for (idx = 0; idx < len2; idx++)
for (idx = 0; idx < len2; idx++)
array1[idx] -= array2[idx];
}retlen = len1 - 1;
for (idx = len1-1; idx >= 0; idx--) else
}}retlen = (retlen < 0) ? 0 : retlen;
for (idx = retlen; idx >= 0; idx--)
result[retlen+1] = '\0';
free(array1);
free(array2);
return result;
大數運算之大數加法(C )
眾所周知,加法運算是小學一年級的學生就懂的知識點。即從兩個數個位開始,按位相加,逢十進一。對於懂得c 的你而言,so so so easy 只需要利用加法運算子即可 但若你要處理的數值位數十分巨大,如兩個位數為20的數相加。在紙上進行運算十分簡單,但在c 中直接使用加法運算子卻無法實現你的預期,這是...
大數相加 相減
這裡直接貼 了,裡面有注釋 另外裡面還有乙個是 乘法的,乘法的再上一部落格就有提到了,讀者可以 clickhere 裡面 由於輸入的問題可能 有亂碼情況 具體的源 我放在 include using namespace std include include define max a,b a b a...
高精度之大數乘大數
現在我們來說一下大數乘以大數。大數乘以大數也是用來模擬手算。舉個例子吧!先從個位開始乙個乙個的乘 乘完個位然後再乘十位,乘十位的時候要和個位的想成的結果相加。這裡注意乘十位的時候 就不要和乘個位數字的結果中的最後一位相加了 就是如圖搓位。就是這樣 下面先貼上我的 include includeusi...