模拟大数据的基本计算, 以解决常规计算器计算数据时位数的有限性
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,项目名称 大数计算器*************************************************大数计算的底层采用string对象存储, 将整型数据转换为字符型进行存储运算的加减
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
手磨咖啡
博彦科技互联网金融
伟宏互联网科技
科技赋能下的互联网金融
今日互联网科技
互联网科技卖菜
杭州互联网科技公司
九亚互联网科技
远拓互联网科技
易通互联网络科技有限公司
上海电发互联网科技有限公司
互联网科技公司实习生
互联网与医疗科技
新兴科技互联网创新大赛颁奖典礼
北京市互联网新科技
21世纪互联网科技成就
上海互联网科技公司ppt
互联网科技包装股
互联网科技的前景
上海旺乐尼互联网科技有限公司
互联网科技公司排名
互联网科技活动banner
易通互联网络科技有限公司
注册互联网科技公司经营范围大全
电子科技大学互联网创业大赛
互联网科技资金流入
互联网风格科技公司名称
下一代互联网重大应用科技园
互联网科技接地气
小牛互联网科技有限公司地址