基礎演算法題 高精度加 減 乘 除

2021-10-04 02:36:30 字數 3690 閱讀 7462

前言

本文僅對正整數進行運算,若擴大到負數只要提前判斷最終結果是否為負,然後將負數轉換為正數計算。當最終結果為負時,只需在答案前加負號即可。

a+b=c由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a[0]用於儲存a的個位,a[1]用於儲存a的十位,依此類推。同樣可以用乙個陣列b來儲存b。

計算c = a + b的時候,首先將a[0]與b[0]相加,如果有進製產生,則把進製(即和的十位數)存入r,把和的個位數存入c[0],即c[0]等於(a[0]+b[0])%10。然後計算a[1]與b[1]相加,這時還應將低位進上來的值r也加起來,即c[1]應該是a[1]、b[1]和r三個數的和.如果又有進製產生,則仍可將新的進製存入到r中,和的個位存到c[1]中。依此類推,即可求出c的所有位。最後將c輸出即可。

#include

#include

using namespace std;

string a, b, c;

void

js(string a, string b)

//計算

reverse

(c.begin()

, c.

end())

; cout<

}int

main()

a-b=c由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a[0]用於儲存a的個位,a[1]用於儲存a的十位,依此類推。同樣可以用乙個陣列b來儲存b。

計算a - b = c 的時候,判斷a與b的大小,用大的減去小的。在這裡我們假設a>b固定。首先從低位相減,如果a[0]要借位,則把a[1]自減1,a[0]-b[0]+10作為個位數存入c[0],即c[0]等於a[0]-b[0]+10。然後計算a[1]與b[1]相減,依此類推,即可求出c的所有位。最後將c輸出即可。

#include

using namespace std;

intmain()

else

if(a==b)

//a - b = c

string c

(a.length()

+2,'0');

reverse

(a.begin()

, a.

end())

;reverse

(b.begin()

, b.

end())

;for

(int i=

0; i

length()

; i++)}

reverse

(c.begin()

, c.

end())

; c = c.

substr

(c.find_first_not_of

('0'))

;if(judge==1)

cout<<

"-";

cout<

return0;

}

a * b = c由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a[0]用於儲存a的個位,a[1]用於儲存a的十位,依此類推。同樣可以用乙個陣列b來儲存b。

計算c = a * b的時候,首先將陣列a與b[0]相乘,得到ab[0]。接著依次將a與b[1]相乘得到ab[1]…由兩數相乘可以得到ab[0]~ab[n](假設b[n]為b的最高位)。計算ab[0] * 100+ab[1] * 10 1 + … + ab[n]*10n得到c陣列,通過高精度加法可以完成,最後將c輸出即可。

#include

using namespace std;

string add

(string a, string b)

//功能實現, 輸入為計算式,輸出計算式

reverse

(s.begin()

, s.

end())

; s=s.

substr

(s.find_first_not_of

('0'))

;reverse

(s.begin()

, s.

end())

;return s;

}string sch

(string s2,

char s1ch)

return s;

}int

main()

string ss;

reverse

(s1.

begin()

, s1.

end())

;reverse

(s2.

begin()

, s2.

end())

;for

(s1_0=

0; s1[s1_0]

=='0'

; s1_0++);

//統計0的數量

for(s2_0=

0; s2[s2_0]

=='0'

; s2_0++);

s1=s1.

substr

(s1.

find_first_not_of

('0'))

; s2=s2.

substr

(s2.

find_first_not_of

('0'))

;for

(int k=

0; k

length()

; k++

)reverse

(ss.

begin()

,ss.

end())

; cout<

for(

int t=

1; t<=s1_0+s2_0; t++

) cout<<

"0";

return0;

}

a / b = c由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a[0]用於儲存a的個位,a[1]用於儲存a的十位,依此類推。同樣可以用乙個陣列b來儲存b。

讓我們通過例子來了解實現過程:

希望能夠將自己的一些學習經驗分享給有需要的人。

我是小鄭,乙個堅持不懈的小白。

演算法基礎 高精度加 減 乘 除

大整數 將數字從個位開始儲存 高精度乘法 高精度除法 的驗證 include include using namespace std bool cmp vector int v1,vector int v2 vector int sub vector int v1,vector int v2 whi...

高精度演算法,加減乘除

高精度演算法的兩個基本問題 高精度數的表示和高精度數的基本運算 1.高精度數的表示 首先我想到的是do while 迴圈逆序存放在陣列之中,但書中用string接受並且將其轉化成數字,存放在陣列之中 int arr 100 string str cin str int len str.length ...

高精度演算法(加減乘除)

最近開始學習解決大數問題,在這裡記錄下自己的學習情況。問題描述 我有乙個非常簡單的問題。給定兩個整數a和b,你的工作是計算a b的和。輸入 輸入的第一行包含整數t 1 t 20 表示測試用例的數量。然後是t行,每行包含兩個正整數,a和b.請注意,整數非常大,這意味著您不應該使用32位整數來處理它們。...