模拟大数据的基本计算, 以解决常规计算器计算数据时位数的有限性
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,项目名称 大数计算器*************************************************大数计算的底层采用string对象存储, 将整型数据转换为字符型进行存储运算的加减
千家信息网最后更新 2025年12月02日模拟大数据的基本计算, 以解决常规计算器计算数据时位数的有限性
项目名称 大数计算器
*************************************************
大数计算的底层采用string对象存储, 将整型数据转换为字符型进行存储运算的加减;采用逐位进行加减, 设计标记位, 标记进位与借位的方式;乘除在加减的基础上控制循环的次数完成对数据的处理
#include#include #include #include using namespace std;#define INT_64 long long#define UN_INIT 0xcccccccccccccccc//不能分开#define MIN_INT 0xffffffffffffffff#define MAX_INT (unsigned)0x7fffffffffffffffclass BigData{public: BigData() :_data(0) , _pdata("") {} BigData(INT_64 data) :_data(data) { INT_64 tmp = _data; char cSymbol = '+'; if (tmp<0) { tmp = 0 - tmp; cSymbol = '-'; } _pdata.append(1, cSymbol); while (tmp) { _pdata.append(1, tmp % 10 + '0'); tmp /= 10; } char* left = (char*)(_pdata.c_str() + 1); char* right = (char*)(_pdata.c_str() + _pdata.size() - 1); char temp; while (left < right) { temp = *left; *left++ = *right; *right-- = temp; } cout<<_data<<_pdata< = '0') { if (ret <= MAX_INT) ret = ret * 10 + *source-'0'; _pdata.append(1, *source); source++; } if (*source = '-') ret = 0 - ret; _data = ret; } BigData(const BigData& bigData) { _data = bigData._data; _pdata = bigData._pdata; } BigData operator+(BigData& bigData) { if (!IsINT64OverFlow() && !bigData.IsINT64OverFlow()) { if (_pdata[0] != bigData._pdata[0]) return BigData(_data + bigData._data); else { if ('+' == _pdata[0] && MAX_INT - _data <= bigData._data || '-' == _pdata[0] && _data >= MIN_INT - bigData._data) return BigData(_data + bigData._data); } } return BigData(Add(_pdata, bigData._pdata).c_str()); } BigData operator-(BigData& bigData) { if (!IsINT64OverFlow() && !bigData.IsINT64OverFlow()) { if (_pdata[0] == bigData._pdata[0]) return BigData(_data - bigData._data); else { if ('+' == _pdata[0] && _data <= MAX_INT + bigData._data || '-' == _pdata[0] && _data >= MIN_INT + bigData._data) return BigData(_data - bigData._data); } } string ret; if (_pdata[0] == bigData._pdata[0]) ret = Sub(_pdata, bigData._pdata); else { ret = Add(_pdata, bigData._pdata); ret[0] = _pdata[0]; } return BigData(ret.c_str()); } BigData operator*(BigData& bigData) { if (!IsINT64OverFlow() && !bigData.IsINT64OverFlow()) { cout<<"pppp"; if (_pdata[0] == bigData._pdata[0]) { if ('+' == _pdata[0] && _data <= (MAX_INT / bigData._data )|| '-' == _pdata[0] && _data >= MAX_INT / bigData._data) { cout<<(_data*bigData._data)<<"KKKKK"; return BigData(_data *bigData._data); } } else { if ('+' == _pdata[0] && _data <= MIN_INT / bigData._data || '-' == _pdata[0] && _data >= MIN_INT / bigData._data) return BigData(_data * bigData._data); } } cout<<"KKKKKKKKll"; return BigData(Mul(_pdata, bigData._pdata).c_str()); } BigData operator/(BigData& bigData) { if (_data == 0 || bigData._data == 0) return BigData((INT_64)0); if (!IsINT64OverFlow() && !bigData.IsINT64OverFlow()) { return BigData(_data / bigData._data); } return BigData(Div(_pdata, bigData._pdata).c_str()); } friend ostream& operator<<(ostream& out, const BigData& b) { out << b._pdata; return out; } friend istream& operator>>(istream& in, BigData& b) { in >> b._pdata; return in; }protected: bool IsINT64OverFlow() { if (_data <= MAX_INT&&_data >= MIN_INT) { cout<<"normal"< 0) cSymbol = '-'; } if (leftSize < rightSize) { swap(s1, s2); swap(leftSize, rightSize); } ret.resize(leftSize + 1); ret[0] = cSymbol; char cRes, cStep = 0; for (int idx = 1; idx < leftSize; ++idx) { cRes = s1[leftSize - idx] - '0' + cStep; if (idx 0) if (leftSize < rightSize || leftSize == rightSize &&strcmp(s1.c_str() + 1, s2.c_str() + 1) < 0) { swap(s1, s2); swap(leftSize, rightSize); if ('+' == cSymbol) cSymbol = '-'; else cSymbol = '+'; } string ret; ret.resize(leftSize); ret[0] = cSymbol; char cRet; for (int idx = 1; idx < leftSize; ++idx) { cRet = s1[leftSize - idx] - '0'; if (idx < rightSize) cRet -= (s2[rightSize - idx] - '0'); if (cRet < 0) { s1[leftSize - idx - 1] -= 1; cRet += 10; } ret[leftSize - idx] = cRet + '0'; } return ret; } string Mul(string s1, string s2) { int leftSize = s1.size(); int rightSize = s2.size(); if (leftSize < rightSize) { swap(leftSize, rightSize); swap(s1, s2); } char cSymbol = '+'; if (s1[0] != s2[0]) cSymbol = '-'; string ret; ret.resize(leftSize + rightSize - 1); memset((void*)ret.c_str(),'0',ret.size()*sizeof(char)); ret[0] = cSymbol; int iDataLen = ret.size(); int offSet = 0; for (int idx = 1; idx < rightSize; ++idx) { char cLeft = s2[rightSize - idx] - '0'; char cStep = 0; if (cLeft == 0) { ++offSet; continue; } for (int iLdx = 1; iLdx < leftSize; ++iLdx) { char cRet = cLeft*(s1[leftSize - iLdx] - '0'); cRet += (cStep + ret[iDataLen - iLdx - offSet] - '0'); ret[iDataLen - iLdx - offSet] = cRet % 10 + '0'; cStep = cRet / 10; } ret[iDataLen - offSet - leftSize] += cStep; ++offSet; } //cout< = 0 && rDataLen >= 0) { if (left[lDataLen] < right[rDataLen]) { if(lDataLen<1) break; left[lDataLen - 1] -= 1; left[lDataLen] += 10; } left[lDataLen] -= right[rDataLen]; left[lDataLen]+='0'; lDataLen--; rDataLen--; } cout< rSize || lSize == rSize&&strncmp(left, right, lSize) >= 0) return true; return false; }private: INT_64 _data; string _pdata;};int main(){ // BigData b1(102); // BigData b2(3); //BigData b3= b1 /b2; //cout << b3 << endl; cout<<(123<=(signed)0x7fffffffffffffff)<
数据
大数
标记
存储
计算器
字符型
乘除
名称
基础
字符
对象
底层
方式
次数
项目
处理
循环
控制
设计
运算
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
夺畅网络技术有限公司待遇
如何维护个人的网络安全
java软件开发项目经历
网络安全二进制入门
国考两年软件开发经历审查
升级win10后连接服务器卡慢
霆智服务器怎么进去
星际争霸2服务器是哪里的
骰子服务器
通信网络技术是美国的吗
三季稻哪个服务器
湖南网络安全硬件设备
阿里云服务器在哪里申请备案码
网络安全与数据安全的关系
sqltile数据库使用
如何入门数据库
qq服务器与客户端
树什么软件开发
ios app 服务器端
串口服务器 ap
金税盘数据库更新失败
万网域名解析到服务器
安庆软件开发多少钱
通信网络技术是美国的吗
悦学帮网络技术有限公司
vip付费数据库设计
网络安全可以算作普法吗
广西广电网络技术中心
福建常见软件开发价格比较
如东软件开发人员工资