大整數的運算

2021-10-06 15:52:32 字數 1737 閱讀 7550

用陣列儲存即可:

如將整數235813儲存到陣列中,則有d[0]=3,d[1]=1,d[2]=8,d[3]=5,d[4]=3,d[5]=2,即整數的高位儲存在陣列的高位,整數的低位儲存在陣列的低位。不反過來儲存的原因是,在進行運算的時候都是從整數的低位到高位進行列舉,順位儲存和這種思維相合。但是這也會產生乙個需要注意問題:把整數按字串%s讀入的時候,實際上是逆位儲存,機str[0]=『2』,str[1]=『3』,…,str[5]=『3』,因此在讀入之後需要在另存為至d陣列的時候反轉一下。而為了方便隨時獲取大整數的長度,一般都會定義乙個int型變數len來記錄其長度,並和d陣列組合成結構體:

大整數的儲存

struct bign

}

大整數的輸入:

bign change

(char str)

return a;

}

大整數的比較:

int

compare

(bign a,bign b)

return0;

}}

這邊只介紹高精度加法,高精度減法,低精度乘法,低精度除法。

高精度加法:(前提是兩個數都是正數,如果有一方是負數的話,可以在轉化陣列時把負號去掉,然後轉化成高精度的減法;如果兩個都是負數的話,可以去掉負號後用高精度的加法,最後再把負號加上)

bign add

(bign a,bign b)

if(carry!=

0)c.d[c.len++

]=carry;

return c;

}

高精度減法:(使用高精度減法之前要比較兩個數的大小,當被減數小於減數時,要將兩個數交換然後輸出符號後再使用sub函式)

bign sub

(bign a,bign b)

c.d[c.len++

]=a.d[i]

-b.d[i];}

while

(c.len-

1>=

1&&c.d[c.len-1]

==0)c.len--

;return c;

}

高精度與低精度的乘法:指的是bign型別和int型別的乘法

步驟:取bign的某位與int型整體相乘,再與進製相加,所得結果的個位數作為該位結果,高位部分作為新進製

如果a和b中存在負數,需要先記錄下來,然後去它們的絕對值帶入函式

bign multi

(bign a,

int b)

while

(carry!=0)

return c;

}

高精度與低精度的除法:指的是bign型別和int型的除法

步驟:上一步的餘數乘以10加上該步上的位,得到該步臨時的被除數,將其與除數比較:如果不夠除,則該位的商為0;如果夠除,則商即為對應的商,餘數即為對應的餘數。最後一步要注意高位後面可能有多餘的0,要忽視他們,但也要保住結果至少有一位

bign divide

(bign a,

int b,

int&r)

}while

(c.len-

1>=

1&&c.d[c.len-1]

==0)c.len--

;return c;

}

超長整數運算(大整數運算)

問題描述 將形如1234567890123456789不能儲存在long變數中的數稱為超長整數或大整數。現討論大整數的加減乘除運算。思想方法 用陣列儲存超長整數,且為處理的簡單起見約定每個元素存放相同位的數字。如 每個元素存放4位。1 加法運算 void add int a,int b,int c ...

大整數的運算

整體套路還是字串模擬 首先判斷大數的符號 同號相加,異號相減 判斷符號 fa a 0 fb b 0 異號為減,同號為加 if fa fb minus a,b else add a,b 處理同號 對同號的處理就是模擬相加 模擬就要考慮到加法運算的問題,順序我們是沒法進行正常的邏輯加運算的,所以要處理下...

大整數運算

包括大整數的四則運算,一般都是用陣列來模擬大整數的,如果是每一位陣列只存一位數的話,空間浪費比較嚴重,所以這裡每一位陣列儲存4位數,所以是10000進製。加法 輸入 不超過兩百位的非負整數,可能有多餘的前導零。輸出 相加後的結果,不能有多餘的前導零 首先是一些基本的常量定義 define bir 1...