<=如果觉得有用,别忘记留下一个免费的赞QWQ
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除等运算
$\color{blue}{本页题目传送门:}$ 无
$\color{blue}{上一次分享:}$一段代码实现所有高精度四则运算!(加法篇)
$\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.再次求赞啦}$
高精度也有有大小比较啊…
$\color{blue}{Q1:如何比较两个bigint是否相等?}$
$\color{Purple}{A1:遍历vector,找是否有一位数值不同}$
注意:我们使用结构体存的vector
struct bigint {
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;
}
}
$\color{blue}{Q2:如何判断两数大小关系?}$
$\color{Purple}{A2:首先检查两个数的位数是否一样,接着检查两个数中每位的数值的大小}$
例如检验bigint 1244和1235的大小:
首先观察位数:都是4位
接着从千位开始比较两个数每一位之间的大小
很明显,刚才比较十位时第1次发现:4大于3
所以:1244 > 1235
struct bigint {
vector <int> vec;
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;
}
}x, y;
当然,还有<=和>=:
注意:在结构体后定义:
bool operator <= (const bigint &e,const bigint &e1) {return !(e > e1);}
bool operator >= (const 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;}
int main() {
cin >> x >> y;
x -= y;
cout << x << endl;
return 0;
}
制作不易,再次求赞!