1. 思想
大整數——將數字從個位開始存儲
高精度乘法:
高精度除法:
2. 模板
- 高精度加法
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int>& v1, vector<int>& v2)
{
vector<int> v3;
int carry = 0;
for(int i=0; i<v1.size()||i<v2.size(); i++)
{
if(i < v1.size()) carry += v1[i];
if(i < v2.size()) carry += v2[i];
v3.push_back(carry%10);
carry /= 10;
}
if(carry > 0) v3.push_back(1);
return v3;
}
int main()
{
string a, b;
cin>>a>>b;
vector<int> v1, v2;
for(int i=a.size()-1; i>=0; i--) v1.push_back(a[i] - '0');
for(int i=b.size()-1; i>=0; i--) v2.push_back(b[i] - '0');
auto v3 = add(v1, v2);
for(int i=v3.size()-1; i>=0; i--) cout<<v3[i];
return 0;
}
- 高精度減法
#include<iostream>
#include<vector>
using namespace std;
bool cmp(vector<int>& v1, vector<int>& v2)
{
if(v1.size() != v2.size()) return v1.size() > v2.size();
for(int i=v1.size()-1; i>=0; i--)
if(v1[i] != v2[i])
return v1[i] > v2[i];
return true;
}
vector<int> sub(vector<int>& v1, vector<int>& v2)
{
vector<int> v3;
for(int i=0, borrow=0; i<v1.size(); i++)
{
borrow = v1[i] - borrow;
if(i < v2.size()) borrow -= v2[i];
v3.push_back((borrow+10)%10);
if(borrow < 0) borrow = 1;
else borrow = 0;
}
while(v3.size() > 1 && v3.back() == 0) v3.pop_back();
return v3;
}
int main()
{
string a, b;
cin>>a>>b;
vector<int> v1, v2;
for(int i=a.size()-1; i>=0; i--) v1.push_back(a[i] - '0');
for(int i=b.size()-1; i>=0; i--) v2.push_back(b[i] - '0');
if(cmp(v1, v2))
{
auto v3 = sub(v1, v2);
for(int i=v3.size()-1; i>=0; i--) cout<<v3[i];
}else{
cout<<"-";
auto v3 = sub(v2, v1);
for(int i=v3.size()-1; i>=0; i--) cout<<v3[i];
}
return 0;
}
- 高精度乘法
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int>& a, int b)
{
vector<int> c;
int t = 0; //進位
for(int i=0; i<a.size(); i++)
{
t = a[i]*b+t;
c.push_back(t%10);
t /= 10;
}
while(t)
{
c.push_back(t%10);
t /= 10;
}
return c;
}
int main()
{
string A;
int B;
cin>>A>>B;
vector<int> a;
for(int i=A.size()-1; i>=0; i--) a.push_back(A[i]-'0');
auto C = mul(a, B);
for(int i=C.size()-1; i>=0; i--) cout<<C[i];
return 0;
}
- 高精度除法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> div(vector<int>& a, int b, int& r)
{
vector<int> c;
r = 0;
for(int i=a.size()-1; i>=0; i--)
{
r = r*10+a[i];
c.push_back(r/b);
r = r%b;
}
reverse(c.begin(), c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main()
{
string A;
int B;
cin>>A>>B;
vector<int> a;
for(int i=A.size()-1; i>=0; i--) a.push_back(A[i]-'0');
int r;
auto C = div(a, B, r);
for(int i=C.size()-1; i>=0; i--) cout<<C[i];
cout<<endl<<r<<endl;
return 0;
}
- 注:本系列參考:AcWing。。。