<=如果觉得有用,别忘记留下一个免费的赞QWQ
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除等运算
$\color{blue}{本页题目传送门:}$ 792.高精度减法
$\color{blue}{上一次分享:}$ 一段代码实现所有高精度四则运算!(符号篇)
$\color{Purple}{持续更新中…}$
为什么要用高精度?
$\color{blue}{在c++中,int, long long等存储方式只能计算十几位的整数运算}$
$\color{blue}{而当我们想要计算更多位时,就需要用到高精度}$
$\color{Purple}{前排提醒:}$
$\color{Purple}{1.本分享采用c++语言}$
$\color{Purple}{2.最终会将所有代码运算整合,更方便使用!}$
$\color{Purple}{3.本页代码仅针对无符号整数}$
$\color{Purple}{4.792主函数难度=a+b,注意符号,主函数代码在最后}$
$\color{Purple}{5.再次求赞啦!}$
再次提醒:这里代码是解决无符号整数的加减!
高精度也有减法操作啊…
$\color{blue}{Q1:如何计算两个bigint相减的结果}$
$\color{Purple}{A1:遍历vector,分别每一位都做减法}$
$\color{blue}{Q2:有注意事项吗?}$
$\color{Purple}{A2:特别注意退位}$
退位操作,一定要注意数组的下标
检查进位操作,我们还是用check来实现!
注意:我们实现的是无符号整数的减法,如果减数大于被减数,那么两数调换位置!
比大小不需要另写函数,已经实现了bigint的<,>等比较
由于两数可能会互换位置,所以e1就不能用const了,切记!
bigint& operator -= (bigint &e, bigint e1) {
if(e < e1) swap(e, e1);
for(int i = 0; i != e1.vec.size(); e.vec[i] -= e1.vec[i], ++ i)
if(e.vec[i] < e1.vec[i]) {
int j = i + 1;
while(!e.vec[j]) ++ j;
while(j > i) {-- e.vec[j]; e.vec[-- j] += 10;}
}
return e.check();
}
顺便重定义-符号的操作
//一定要写在-=的后面
bigint operator - (bigint e, const bigint &e1) {return e -= e1;}
本章总结:我们实现了-=,-的大整数功能!
最终代码参上:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10009;
struct bigint {
//bool flag = true;
vector <int> vec;
bool operator != (const bigint &e) const{
if(vec.size() != e.vec.size()) return true;
for(int i = vec.size() - 1;i >= 0;-- i)
if(e.vec[i] != vec[i]) return true;
return false;
}
bool operator == (const bigint &e) const{
if(vec.size() != e.vec.size()) return false;
for(int i = vec.size() - 1;i >= 0;-- i)
if(e.vec[i] != vec[i]) return false;
return true;
}
bool operator < (const bigint &e) const{
if(vec.size() != e.vec.size()) return vec.size() < e.vec.size();
for(int i = vec.size() - 1;i >= 0;-- i)
if(vec[i] != e.vec[i]) return vec[i] < e.vec[i];
return false;
}
bool operator > (const bigint &e) const{
if(vec.size() != e.vec.size()) return vec.size() > e.vec.size();
for(int i = vec.size() - 1;i >= 0;-- i)
if(vec[i] != e.vec[i]) return vec[i] > e.vec[i];
return false;
}
bigint& check() {//在各类运算中经常用到的进位小函数,不妨内置
while(!vec.empty() && !vec.back()) vec.pop_back();//去除最高位可能存在的0
if(vec.empty()) return *this;
for(int i = 1;i < vec.size();++ i) {
vec[i] += vec[i - 1] / 10;
vec[i - 1] %= 10;
}
while(vec.back() >= 10) {
int e = vec.back();
vec.back() %= 10;
vec.push_back(e / 10);
}
return *this;//为使用方便,将进位后的自身返回引用
}
}x, y;
istream &operator >>(istream &is, bigint &e) {
string s;
is >> s;
e.vec.clear();
for(int i = s.size() - 1;i >= 0;-- i) e.vec.push_back(s[i] - '0');
return is;
}
ostream &operator <<(ostream &os, const bigint &e) {
if(e.vec.empty()) os << 0;
for(int i = e.vec.size() - 1; i >= 0; -- i) os << e.vec[i];
return os;
}
bool operator <= (const bigint &e,const bigint &e1) {return !(e > e1);}
bool operator >= (const bigint &e,const bigint &e1) {return !(e < e1);}
bigint& operator += (bigint &e, const bigint &e1) {
if(e.vec.size() < e1.vec.size()) e.vec.resize(e1.vec.size());
for(int i = 0;i != e1.vec.size();++ i) e.vec[i] += e1.vec[i];
return e.check();
}
bigint operator + (bigint e, const bigint &e1) {return e += e1;}
bigint& operator -= (bigint &e, bigint e1) {
if(e < e1) swap(e, e1);
for(int i = 0; i != e1.vec.size(); e.vec[i] -= e1.vec[i], ++ i)
if(e.vec[i] < e1.vec[i]) {
int j = i + 1;
while(!e.vec[j]) ++ j;
while(j > i) {-- e.vec[j]; e.vec[-- j] += 10;}
}
return e.check();
}
bigint operator - (bigint e, const bigint &e1) {return e -= e1;}
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
cin >> x >> y;
x -= y;
cout << x << endl;
return 0;
}
792AC主函数代码:
int main() {
cin >> x >> y;
if(x < y) cout << '-';
x -= y;
cout << x << endl;
return 0;
}
制作不易,再次求赞!