上篇介紹了基礎的表示結構以及函式介紹,本篇將開始介紹加減實現的過程。
由於整數有正負之分,所以兩個整數相加有四種情況: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 ...