前言
在C++中,数据范围超过long long 的范围时,就要考虑到高精度,下面为运用容器实现的高精度加减法。(刚学,可能存在瑕疵)
基本步骤
对于输入的数据可以用string接收。然后遍历要运算的数据存入容器vector< int >中。 一. 加法
- 设置一个int = temp变量存放将两个数据逐位相加的值,并加上进位,temp %10 则为结果在该位上的值,temp / 10则是下一位的进位(0或1)。
- 每一位都相加到最后。
- 加完后再判断一下是否有进位。
二. 减法 - 首先判断两个数的大小。先比较长度,长度一样则逐位比较。
- 设置一个int = temp变量先存放减数和减去借位,如果被减数该位存在再用temp减去。(temp+10) %10 则为结果在该位上的值。
- 判断temp是否小于0,得出下一位的进位(0或1)。
代码实现
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> a,vector<int> b){
if(a.size() < b.size()) return add(b,a);
vector<int> c;
int t = 0;
for(int i = 0; i < a.size(); i ++){
t += a[i];
if(i < b.size()) t += b[i];
c.push_back(t%10);
t = t / 10;
}
if(t > 0) c.push_back(t);
return c;
}
int main(){
string a, b;
cin >> a >> b ;
vector<int> aa;
vector<int> bb;
for(int i = a.size()-1; i >= 0; i -- ) aa.push_back(a[i] - '0');
for(int i = b.size()-1; i >= 0; i -- ) bb.push_back(b[i] - '0');
auto C = add(aa,bb);
for(int i = C.size()-1; i >= 0; i -- ) cout<<C[i];
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
bool com(vector<int> a,vector<int> b){
if(a.size() != b.size()) return a.size() > b.size();
else{
for(int i = a.size() - 1; i >= 0; i--)
if(a[i] != b[i]) return a[i] > b[i];
}
return true;
}
vector<int> sub(vector<int> a,vector<int> b){
if(!com(a,b)) return sub(b,a);
vector<int> c;
int t = 0;
for(int i = 0; i < a.size(); i ++){
t = a[i] - t;
if(i < b.size()) t = t - b[i];
c.push_back((t + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main(){
string a, b;
cin >> a >> b ;
vector<int> aa, bb;
for(int i = a.size()-1; i >= 0; i -- ) aa.push_back(a[i] - '0');
for(int i = b.size()-1; i >= 0; i -- ) bb.push_back(b[i] - '0');
auto C = sub(aa,bb);
if(!com(aa,bb)) cout<<"-";
for(int i = C.size()-1; i >= 0; i -- ) cout<<C[i];
return 0;
}
代码模板
高精度加法 —— 模板题 AcWing 791. 高精度加法
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
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;
}
高精度减法 —— 模板题 AcWing 792. 高精度减法
vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size(); i ++ )
{
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
作者:yxc
链接:https:
来源:AcWing
|