前言:
前面介紹了有關的思想,和本片部落格的測試環境,所以作為第二篇的減法篇就不再過多的介紹,直接開始關於大數加法的實現。
大數減法:
與加法類似,還是將使用者的輸入和結果放入變長的陣列中然後模仿手工運算從低位到高位依次相減,會有三個需要解決的問題,其中前二個和大數加法的問題很相似,所以就不再詳細說明。
問題:
1.結果最多有多少位?
2.借位的演算法如何實現?
3.如果乙個8位數減去4位數,那麼8位數較高的4位如何處理?
前兩個問題參考大數加法都可以得到解決。
1.結果的最大位數和較大的減數字數相同,所以結果陣列的長度可以和減數字數相同。
2.同加法類似,先儲存每位相減的結果然後在用乙個迴圈作整理。
3.可以把被減數缺少的位數用零補全然後相減,也可以只減到被減數的位數,然後將減數的高位直接寫道結果的陣列中。
注意:
本演算法只可以拿大數減小數,因為小數減大數只不過還是拿大的減小的然後加個負號而已,所以本著簡潔的原則,只允許用大數減去小數。
實現:
同加法一樣還是把減法寫成方法,然後在mian函式中呼叫,下面是完整的有詳細注釋的**。
1
//#include"big.h"
2#include
3#include
4#include
5char * bigsub(char *suba,int lena,char *subb,int lenb)
12for(i=0;i13 subb[i]=subb[i]-num;
14 }
15char *result,final[bufsiz];
16 result=(char*)calloc(lensum,1); //動態分配記憶體空間,在大數加法中忘記介紹
17for(i=0,j=0;i//calloc()有兩個引數,本次會分配 『lensum』 個大小為 『1』 位元組的記憶體空間
18 result[i]=suba[lena-i-1]-subb[lenb-i-1]; //並且全部初始化為0,返回指向記憶體的指標
19 }
20if(lena>lenb)
24 }
25if(lenb>lena)
29 }
30for(k=0;k1;k++)
35 }
36 j=0;
37if(result[lensum-1]!=0)
41for(i=lensum-2;i>=0;i--)
45 result=final; //將指標指向final陣列並返回陣列的指標。
46return result;
47 }
48int main()
大數減法 C語言
關於大數減法其核心就是 減法的演算法也是從低位開始減,先要判斷減數和被減數那乙個位數長,被減數字數長是正常減 減數字數長,則減數 被減數,最後還要加上負號 兩個位數長度相等時,最好比較哪乙個數大,否則負號會處理的很繁瑣 處理每一項時,要先按對應的位用被減數減去減數,用陣列存入,如果差小0,需要向上一...
大數運算 加法減法
第一篇博文有點小雞凍。在哈工程寒假集訓中第一次模擬中唯一一道對我有價值的題就是大數加法,隨後的幾次模擬中大數運算不斷,可見這是我們必須掌握的技能,本人智商較低,先講解下大數加法減法,乘除階乘或者結合其他知識的大數運算日後定會奉上。究竟為什麼要用大數加法呢。我們來看下資料 bool型為布林型,佔1個位...
大數四則運算之減法運算 c語言版
分三種情況 1.減數長度大於被減數 交換減數與被減數,輸出負號,方便減 2.減數長度等於被減數 分三種情況 a.減數大於被減數,類似1情況1 b.減數等於被減數,兩數相等,直接輸出0,完成。c.減數小於被減數 3.減數長度小於被減數 include include intmain if strlen...