超長整數的基礎運算 演算法實現之加 減篇

2021-06-26 10:42:47 字數 2097 閱讀 9120

上篇介紹了基礎的表示結構以及函式介紹,本篇將開始介紹加減實現的過程。

由於整數有正負之分,所以兩個整數相加有四種情況:a+b,a+(-b),(-a)+b和-a+(-b)。

對於a+b和-a+(-b),可以通過對陣列對應位元素相加即可,主要是考慮進製問題。而a+(-b)和(-a)+b,

其實就是兩個大整數的減法,其主要考慮的問題是向高位借位的問題。所以減法可以通過加法的運算得到結果。

1、符號相同的加法運算

符號相同的加法運算的實現過程是基於這樣的乙個原因:因為兩個整數的符號相同,可以直接對兩個整數陣列對應位元素相加,並考慮進製問題。因為兩個整數的數字存在以下三種情況(不妨設兩個大整數分別為src1和src2):src1->length == src2->length;src1->length > src2->length; src1->length < src2->length。所以在處理加法的時候,對數字較大的整數一分為二,第一部分是跟另一大整數的長度相等。可以先把相同長度部分先計算,然後再對多出的長度部分直接賦值,這樣可以不用考慮誰大誰小問題,而且可以加快運算速度。如下表所示:

分段運算過程:

1   2   3

4    5    6    7    8   9

4    5    6    7    8   9

9    1    3    5    7   8

1   2   3

9    1    3    5    7   8

2、符號不同的加法運算,即減法運算

符號不同的加法運算的過程,也是跟符號相同的加法過程類似。也是對數字較大的整數進行分段,不過,它也有不同的地方。因為符號不相同,這個加法就是減法。因為不知道是哪個大整數較大,當它們做減法運算的時候,就有可能會在最高數字出現負數問題,而大整數各位元素都為正數,所以要多處理一步,即對負數轉換成正整。而如果把無符號整數的較大者作為被減數,就可以省略這一步。所以此運算過程是:先對兩個大整數進行無符號比較,最大者作為被減數,然後進行減法操作。

/*

加法運算

*/

int addhbint(hbigint* dst, hbigint* src1, hbigint* src2)

//對較大的大整數數字多出部分進行計算

psrc = (src1->length > src2->length) ? src1 : src2;

while(i < psrc->length)

if(mark)

dst->sign = src1->sign;

dst->length = dstlen;

return return_ok_bint;

}

/*

減法運算(保證是同號相減,否則採用加法實現)

*/

int subhbint(hbigint* dst, hbigint* src1, hbigint* src2) 

// src2比src1大,交換臨時指標變數,保證psrc1始終大於psrc2

if(re == -1)

// 對兩整數相同長度部分進行計算

for(i=0; ipbigint[i] = result;

} // 對數字較大部分的借位計算

while(i < len_max) else }

// 剩餘高位直接賦值

memcpy(dst->pbigint+i,psrc_max+i,sizeof(un_short)*(len_max-i));

dst->length = len_max;

dst->sign = sign;

trimhbint(dst); //對結果去掉前面的0,當最高位為0時,需要修改length的值

return 1;

}

說明:以上函式中使用到的其他函式,例如extendhbint和assignhbint等將在系列介紹完大整數運算結束後將**貼出。

超長整數的基礎運算 演算法實現之進製轉換篇

十進位制轉二進位制 由於單個 位 採用的是216 1作為理論最大值,因此在本次大整數的表示過程中每個類似 十進位制 位可採用16位的二進位制來表示,符號位單獨表示。十 進製轉換成二進位制,實際上是經過中間狀態 即大整數的邏輯儲存表示 轉化。在轉換過程中大整數的每個 位 無耦合,不存在依賴關係,因此實...

C語言實現二叉排序樹的基本運算演算法

二叉排序樹的建立 查詢和刪除過程及其演算法設計。1 由關鍵字序列 4,9,0,1,8,6,3,5,2,7 建立一棵二叉排序樹bt並以括號表示法輸出 2 判斷bt是否為一棵二叉排序樹 3 採用遞迴和非遞迴兩種方法查詢關鍵字6的節點,並輸出其查詢路徑 4 分別刪除bt中關鍵字為4和5的結點,並輸出刪除後...

2 只用位運算不用演算法運算實現整數的加減乘除運算

寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。結論性思路 1.不考慮進製 a b就是正確答案。其中 是異或操作,即相同 0,不同 1 舉例1 0 1 1 二進位制 0000 0001 0001 0 1 1 舉例2 7 5 12 不進製情況下,7 5個位數為2,0111 0101 ...