學習平台: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');
判斷a
和b
哪個大
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...