高精度运算
当输入数据位数过大时,使用数组来表示大整数,并对应地设计大整数运算。
1.高精度加法
题目链接:点击跳转
代码模板:
#include<iostream>
#include<vector>
using namespace std;
const int MAXLEN = 100010;
vector<int> add(vector<int>& a, vector<int>& b)
{
vector<int> c;
int t=0;
for (int i=0;i<a.size()||i<b.size();++i) {
//每次循环可计算一位,并把进位保存在t中,用于下一位运算
//若加数的该位不为空则加到t中
if (i<a.size()) t+=a[i];
if (i<b.size()) t+=b[i];
c.push_back(t%10);
t/=10;
}
if (t) c.push_back(t);
return c;
}
int main()
{
string s1,s2;
cin >> s1;
cin >> s2;
vector<int> a,b;
for (int i=s1.size()-1;i>=0;--i) a.push_back(s1[i]-'0');
for (int i=s2.size()-1;i>=0;--i) b.push_back(s2[i]-'0');
auto c = add(a,b);
for (int i=c.size()-1;i>=0;--i) cout << c[i];
return 0;
}
2.高精度减法
题目链接:点击跳转
与高精度加法的思路类似。要注意比较减数与被减数的大小(结果有可能为负)
代码模板:
#include<iostream>
#include<vector>
using namespace std;
const int MAXLEN = 100010;
static int flag = 0;
bool cmp(vector<int>& A, vector<int>& B)
{
if (A.size()>B.size()) return true;
else if (B.size()>A.size()) return false;
else {
int i=A.size()-1;
while (i>=0) {
if (A[i]!=B[i]) return A[i]>B[i];
else i--;
}
return true;
}
}
vector<int> sub(vector<int>& A, vector<int>& B)
{
if (cmp(A,B)==false) {flag=1; return sub(B,A);}
vector<int> C;
int t = 0;
int i = 0;
while (i<A.size()) {
//先取被减数的该位
t = A[i]-t;
//再减去减数的该位
if (i<B.size()) t -= B[i];
C.push_back((t+10)%10);
//根据t的正负,确认是否要向高一位借位
t = (t<0) ? 1:0;
i++;
}
//消除首位多余的0,同时考虑到结果为0的情况,要保证长度不小于1
while (C.size()>1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string s1,s2;
vector<int> A,B;
cin >> s1;
cin >> s2;
for (int i=s1.size()-1;i>=0;--i) {
A.push_back(s1[i]-'0');
}
for (int i=s2.size()-1;i>=0;--i) {
B.push_back(s2[i]-'0');
}
vector<int> C = sub(A,B);
if(flag) cout << "-";
for (int i=C.size()-1;i>=0;--i) {
cout << C[i];
}
return 0;
}
3.高精度乘法
题目链接:点击跳转
这里的乘数b的范围较小
代码模板:
#include<iostream>
#include<vector>
using namespace std;
const int MAXLEN = 100010;
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
int i=0, t=0;
//同样地,t%10代表当前位的数值,t/10代表进位
while (i<A.size()||t) { //当i的大小超出A的长度同时t的值大于0时,代表有进位
if (i<A.size()) t = A[i++]*b+t;
C.push_back(t%10);
t/=10;
}
//除去前导0
while (C.size()>1 && C.back()==0) {C.pop_back();}
return C;
}
int main()
{
vector<int> A;
int b;
string s;
cin >> s;
cin >> b;
for (int i=s.size()-1;i>=0;--i) {
A.push_back(s[i]-'0');
}
auto C = mul(A,b);
for (int i=C.size()-1;i>=0;--i) {
cout << C[i];
}
return 0;
}
4.高精度除法
题目链接:点击跳转
代码模板:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXLEN = 100010;
vector<int> div(vector<int> &A, int b, int &r)
{
vector<int> C;
//从高位开始计算
int i = A.size()-1; r = 0;
while (i>=0) {
r = r*10+A[i--];
C.push_back(r/b);
r = r%b;
}
//得到的结果是逆序,需要反转
reverse(C.begin(),C.end());
//除去前导0
while (C.size()>1 && C.back()==0) C.pop_back();
return C;
}
int main()
{
vector<int> A;
string s;
int b,r;
cin >> s >> b;
for (int i=s.size()-1;i>=0;--i) {A.push_back(s[i]-'0');}
auto C = div(A,b,r);
for (int i=C.size()-1;i>=0;--i) {cout << C[i];}
cout << endl;
cout << r;
return 0;
}