整體套路還是字串模擬
首先判斷大數的符號:
同號相加,異號相減
//判斷符號
fa =
('-'
== a[0]
);fb =
('-'
== b[0]
);//異號為減,同號為加
if(fa ^ fb)
minus
(a, b)
;else
add(a, b)
;
處理同號
對同號的處理就是模擬相加
模擬就要考慮到加法運算的問題,順序我們是沒法進行正常的邏輯加運算的,
所以要處理下字串位置問題進行乙個逆序的操作
//翻轉字串
for(i = fa, j = la -
1; i <= j;
++i,
--j)
swap
(a, i, j)
;for
(i = fb, j = lb -
1; i <= j;
++i,
--j)
swap
(b, i, j)
;
開始模擬相加,同時要考慮到相加值溢位的問題
//模擬加法
for(i = fa; i < la || i < lb;
++i)
a[i]
= c;
l = c ? i : i -
1;
最後逆序輸出,不要忘了符號
//在逆序輸出
if(fa)
printf
("-");
for(i = l; i >= fa;
--i)
printf
("%d"
, a[i]
);
下面考慮符號相異問題,相異就要考慮兩個大數的大小判斷,在大小判斷基礎上再在進行減法的模擬
首先處理這兩個大數的絕對值大小問題
//判斷ab的絕對值大小
intcmp
(char
* a,
char
* b)
}
同樣先進行逆序操作
for
(i = fa, j = la -
1; i <= j;
++i,
--j)
swap
(a, i, j)
;for
(i = fb, j = lb -
1; i <= j;
++i,
--j)
swap
(b, i, j)
;
模擬減法
//模擬減法
c =0;
l =-1
;for
(i =
0; i + fa < la;
++i)
逆序輸出,先判斷是否為0的問題
if
(l <0)
printf
("0");
else
超長整數運算(大整數運算)
問題描述 將形如1234567890123456789不能儲存在long變數中的數稱為超長整數或大整數。現討論大整數的加減乘除運算。思想方法 用陣列儲存超長整數,且為處理的簡單起見約定每個元素存放相同位的數字。如 每個元素存放4位。1 加法運算 void add int a,int b,int c ...
大整數的運算
用陣列儲存即可 如將整數235813儲存到陣列中,則有d 0 3,d 1 1,d 2 8,d 3 5,d 4 3,d 5 2,即整數的高位儲存在陣列的高位,整數的低位儲存在陣列的低位。不反過來儲存的原因是,在進行運算的時候都是從整數的低位到高位進行列舉,順位儲存和這種思維相合。但是這也會產生乙個需要...
大整數運算
包括大整數的四則運算,一般都是用陣列來模擬大整數的,如果是每一位陣列只存一位數的話,空間浪費比較嚴重,所以這裡每一位陣列儲存4位數,所以是10000進製。加法 輸入 不超過兩百位的非負整數,可能有多餘的前導零。輸出 相加後的結果,不能有多餘的前導零 首先是一些基本的常量定義 define bir 1...