基礎演算法 高精度 大整數

2022-09-14 04:18:14 字數 3872 閱讀 7326

學習平台:acwing

高精度的數一般比較大,普通的整型變數存不下,所以存在string裡或者char

模擬數學的普通加法

\(len(a) <= 10^9\),\(len(b) <= 10^9\)

為了方便地進行進製操作,將大整數的每一位倒著存放在整形陣列int

string a, b;

vectora, b;

cin >> a >> b;

for (int i = a.size() - 1; i >= 0; i--) a.push_back(a[i] - '0');

for (int i = b.size() - 1; i >= 0; i--) b.push_back(b[i] - '0');

進行加和操作

以下,變數t既作為進製數,又作為加和的中間變數,t % 10為每位的結果,t / 10為進製數

vectorc = add(a, b);

vectoradd(vector&a, vector&b)

if (t) c.push_back(1); // 為圖上s4的情況

return c;

}

倒序輸出

for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
模擬數學的普通減法

\(len(a) <= 10^9\),\(len(b) <= 10^9\)

同樣倒著儲存,這樣方便去除前導0,下面解釋

string a, b;

vectora, b;

cin >> a >> b;

for (int i = a.size() - 1; i >= 0; i--) a.push_back(a[i] - '0');

for (int i = b.size() - 1; i >= 0; i--) b.push_back(b[i] - '0');

判斷ab哪個大

if (cmp(a, b))  else
cmp比較**

先通過長度比較,若長度相等,遍歷比較每一位。若全部相同,返回true

bool cmp(vector&a, vector&b) 

for (int i = a.size() - 1; i >= 0; i--)

}return true;

}

進行減法操作

變數t既作為借位數,也作為減法的中間變數。

解釋,每位的結果(t + 10) % 10

減法運算,每一位減法後都為[-10 ~ 10]之間的數

vectorsub(vector&a, vector&b) 

while (c.size() > 1 && c.back() == 0) c.pop_back(); // 去除前導0

return c;

}

為什麼要去除前導零,最後幾位減出來的0也同樣被push_back進去了

模擬數學的普通乘法

\(len(a) <= 10^9\),\(b <= 10^6\),對於\(a\times b\)的情況,以後會更新

同樣,為方便進製,倒序儲存

string a;

int b;

vectora;

cin >> a >> b;

for (int i = a.size() - 1; i >= 0; i--) a.push_back(a[i] - '0');

進行乘法操作

while (c.size() > 1 && c.back() == 0)c++ c.pop_back(); // 去除前導0

return c;

}去除前導0操作,如\(12345\times0=00000\),需要去除前導0

最後倒序輸出

for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
模擬數學的普通除法

\(len(a) <= 10^9\),\(b <= 10^6\),對於\(a\div b\)的情況,以後會更新

不用倒序儲存,為了方便與其他大整數運算結合,同樣採用倒序儲存

string a;

int b, r = 0;

cin >> a >> b;

vectora;

for (int i = a.size() - 1; i >= 0; i--) a.push_back(a[i] - '0');

進行除法操作

根據上圖,不難推出除法的一般式

\(r_i=(r_\%10)\times10+a_i\)

\(s_i=r_i/b\)

除法與前面幾種運算不同,從高位開始推導

vectorc = div(a, b, r);

// a / b,商為c,餘數為r

vectordiv(vector&a, int b, int &r)

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

while (c.size() > 1 && c.back() == 0) c.pop_back(); // 去除前導0

return c;

}

關於前導0,例如 \(121\div11=011\),應除去前導0

最後reverse一下,去掉前導0

最後倒序輸出結果,並輸出餘數r

for (int i = c.size() - 1; i >= 0; i--) cout << c[i];

cout << endl << r << endl;

791. 高精度加法 - acwing題庫r

792. 高精度減法 - acwing題庫

793. 高精度乘法 - acwing題庫

794. 高精度除法 - acwing題庫

project euler(尤拉計畫) problem 13 large sum

高精度 大整數減法

求兩個大的正整數相減的差。共2行,第1行是被減數a,第2行是減數b a b 每個大整數不超過200位,不會有多餘的前導零。一行,即所求的差。本題考察的是高精度減法。我們可以模擬減法的豎式計算過程從而實現高精度的計算。和高精度加法一樣,也是使用字串來進行輸入 儲存。豎式計算時,也是低位對齊,從低位向高...

高精度 大整數加法

求兩個不超過200位的非負整數的和。有兩行,每行是乙個不超過200位的非負整數,可能有多餘的前導0。一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。22222222222222222222 33333333333333333333 本題考察的是高精度計算...

基本演算法 高精度計算 大整數相加

求兩個不超過200位的非負整數的和。有兩行,每行是乙個不超過200位的非負整數,可能有多餘的前導0。一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。22222222222222222222 33333333333333333333 55555555555...