大整數的運算

2021-09-29 17:23:57 字數 1665 閱讀 5990

整體套路還是字串模擬

首先判斷大數的符號:

同號相加,異號相減

//判斷符號

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...