非负整数大数高精度加法乘法【c++】
C++ 整数 乘法 高精度 加法 大数
2023-09-11 14:20:51 时间
高精度模板,效率一般,不过大部分题目可以凑合凑合过。
追求极致的大佬可以忽略了。
class BN {//大数字 比较 加法 乘法 cout
private:
static const int MAXN = 86;
int data[MAXN];
int len;
public:
BN() { len = 1; data[0] = 0; for (int i = 0; i < MAXN; ++i) { data[i] = 0; } } //默认初始化为0;
BN(int a){
for (int i = 0; i < MAXN; ++i) { data[i] = 0; }
len = 0;
do {
data[len] = a % 10;
a /= 10;
len++;
}while(a);
}
bool operator<(const BN& a) const { //这地方的第二个const是必须的 否则就会报错 (可能是用了vector的缘故吧我这么猜)
if (len < a.size()) {
return true;
}
else if (len == a.size()) {
for (int i = len-1; i >=0; --i) {
if (data[i] < a.data[i]) {
return true;
}
else if (data[i] > a.data[i]) {
return false;
}
}
}
return false;
}
BN operator+(const BN& a) {
BN ret(0);
int i = 0, j = 0;
int jin = 0;
int temp;
ret.len = 0;
while (i < len && j < a.size()) {
temp = jin + data[i++] + a.data[j++];
ret.data[ret.len++] = temp % 10;
jin = temp / 10;
}
while (i < len) {
temp = jin + data[i++];
ret.data[ret.len++] = temp % 10;
jin = temp / 10;
}
while (j < a.size()) {
temp = jin + a.data[j++];
ret.data[ret.len++] = temp % 10;
jin = temp / 10;
}
if (jin != 0) {
ret.data[ret.len++] = jin;
}
return ret;
}
BN operator*(const BN& a) {
if ((a.size() == 1&& a.data[0] == 0 )||( len == 1 && data[0] == 0)) {
return BN(0);
}
BN ret(0);
int jin=0, cur=0, temp=0;
for (int i = 0; i < len; ++i) {
jin = 0,cur = i,temp = 0;
for (int j = 0; j < a.size(); ++j) {
temp = data[i] * a.data[j] + jin + ret.data[cur];
ret.data[cur++] = temp % 10;
jin = temp / 10;
}
if (jin) {
ret.data[cur++] = jin;
}
}
while (cur > 1 && ret.data[cur - 1] == 0) {
cur--;
}
ret.len = cur;
return ret;
}
/*
friend ostream & operator<<(ostream& cot,BN & a) {
for (int i = a.len - 1; i >= 0; --i) {
cot << a.data[i];
}
return cot;
}*/
friend ostream& operator<<(ostream& cot,const BN& a) { ///这样就可以使用cout<<a*b 了 分析原因如下:a*b返回一个BN,但是他很快会被释放(因为是返回值) ,const BN & a = xxx 底层上是创建了一个变量来存储xxx 然后对其引用
for (int i = a.len - 1; i >= 0; --i) {
cot << a.data[i];
}
return cot;
}
int size() const {
return len;
}
};
有缺陷还请指出!
相关文章
- C++ 调用 .lib 文件中的函数
- c++之cin/cin.get/cin.getline()详解
- C++ Primer中文版(第5版)
- C/C++——程序的内存分配
- 53 C++ - 虚析构函数
- C++中使用TCP传文件
- C++ 深拷贝和浅拷贝
- 开源免费的C/C++网络库(c/c++ sockets library)补充
- 《C++游戏编程入门(第4版)》——2.13 本章小结
- 《C++面向对象高效编程(第2版)》——第2章 什么是数据抽象
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.3 请考虑边界条件
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.1 构造函数
- 《数字图像处理与机器视觉——Visual C++与Matlab实现》——1.2 Matlab图像类型及其存储方式
- ZOJ1001 A + B Problem(C++实现,通过字符串操作实现大整数加减运算)
- C++使用stringstream分割字符串
- 要写出优雅的二分查找实属不易(C++,LeetCode34)
- suseoj 1207: 大整数的乘法(java, 大数相乘, C/C++, 大数相乘)