AcWing演算法基礎1 4

2022-03-04 03:52:08 字數 3243 閱讀 9793

高精度

高精度加法,高精度減法,高精度乘低精度,高精度除以低精度,大概平時用的最多的就是這四個,模板有兩種(因為我現在不太會用vector,就用陣列也寫了個,23333)

高精度運算和人工手算差不多,就是模擬人工手算的過程,乘法有點不一樣,在下面有提到,大致也是模擬運算

廢話不多說,上模板

高精度加法

1

//c = a + b, a >= 0, b >= 0

2 vector add(vector &a, vector &b)315

16if

(t) c.push_back(t);

17return

c;18 }

高精度減法

1

//c = a - b, 滿足a >= b, a >= 0, b >= 0

2 vector sub(vector &a, vector &b)313

14while (c.size() > 1 && c.back() == 0

) c.pop_back();

15return

c;16 }

這裡高精度減法對於a < b 的情況我們特判下輸出個 - 就好了,模板第九行是比較巧的一步,因為我們減一位後 t 的取值範圍是(-10,10)t 可能是正數也可能是負數,對於正數我們可以直接拿來用,對於負數要向前面一位進1,相當於把 t 加10,這裡寫成(t + 10)% 10  就能把兩種情況寫在一起了

高精度乘低精度

1

//c = a * b, a >= 0, b > 0

2 vector mul(vector &a, intb)3

1213

return

c;14 }

乘法和我們人模擬的算有點差別,比如156 * 23 算第一位的時候直接拿6 * 23,然後再拿5 * 23 + 進製,以此類推

高精度除以低精度

1

//a / b = c ... r, a >= 0, b > 0

2 vector div(vector &a, int b, int &r)312

reverse(c.begin(), c.end());

13while (c.size() > 1 && c.back() == 0

) c.pop_back();

14return

c;15 }

上面是用vector的模板,對於不會用vector的我,用陣列寫了個,呃呃呃呃....

高精度加法

1 #include 2 #include 3 #include 4

5using

namespace

std;

6int add(int a, int

b);7

const

int n = 100000 + 10;8

char

x1[n], x2[n];

9int

a[n], b[n], c[n];

1011

intmain()

1227

28int add(int a, int

b)29

39if(t) c[id++] =t;

40return

id;41 }

高精度減法

1 #include 2 #include 3 #include 4

5using

namespace

std;

6int mun(int a, int

b);7

bool cmp(int a, int

b); //用來比較a,b誰大,判斷是輸出正數還是負數

8const

int n = 100000 + 10;9

char

x[n], y[n];

10int

a[n], b[n], c[n];

1112

intmain()

1325

26int mun(int a, int

b)27

3839

int id =mx;

40for(int i = mx - 1; i > 0; i --) //去除前導零

4145

return

id; //id是陣列c的長度46}

4748

bool cmp(int a, int

b)49

56return0;

57 }

高精度乘法

1 #include 2 #include 3 #include 456

using

namespace

std;

7int mul(int a, int

b);8

const

int maxa = 100000 + 10;9

char

x[maxa];

10int

a[maxa], c[maxa], b;

1112

intmain()

1323

24int mul(int a, int

b)25

33if(t) c[id++] =t;

34return

id;35 }

高精度除法

1 #include 2 #include 3 #include 4

5using

namespace

std;

6int div(int b, int

k);7

const

int n = 100000 + 10;8

stringa;9

intb[n], c[n], k, t; //t是餘數

1011

intmain()

1226

27int div(int b, int

k)28

36return

id;37 }

輸出兩行,第一行是商,第二行是餘數

AcWing演算法基礎1 5

字首和與差分 兩個內容都比較少,就放一起寫了 設陣列 a 的前 n 項為a1 a2 a3 an 字首和陣列就是每一項是a陣列的前i項和,比如字首和陣列res,res 1 a 1 res 2 a 1 a 2 res n a 1 a 2 a n 字首和可以在o 1 的時間內計算一段區間內的累加和,比如區...

AcWing演算法基礎1 3

二分 二分分為整數二分和實數二分,其中整數二分模板有兩個 模板 整數二分模板 第一種模板將區間分為 l mid 和 mid 1,r 1 int bsearch 1 int l,intr 2 9return l 10 第二種模板把區間分為 l mid 1 和 mid r 需要注意的是,這裡算mid時要...

AcWing演算法基礎1 1

排序 快速排序 快排 寫題的時候用的不多基本都是直接sort 面試可能要手擼快排,上模板 1 void quick sort int q,int l,intr 2 12 quick sort q,l,j quick sort q,j 1 r 13 模板題 給定你乙個長度為n的整數數列。請你使用快速排...