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



