模拟大数据的基本计算, 以解决常规计算器计算数据时位数的有限性

项目名称 大数计算器

*************************************************

大数计算的底层采用string对象存储, 将整型数据转换为字符型进行存储运算的加减;采用逐位进行加减, 设计标记位, 标记进位与借位的方式;乘除在加减的基础上控制循环的次数完成对数据的处理

#include<iostream>
#include<cassert>
#include<string>
using namespace std;
#define INT_64 long long
#define UN_INIT  0xcccccccccccccccc//不能分开
#define MIN_INT  0xffffffffffffffff
#define MAX_INT  0x7fffffffffffffff
class  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;
		}
	}
	BigData(const char* pData)
	{
		assert(pData);
		INT_64 ret = 0;
		char* source = (char*)pData;
		char cSymbol = ‘+‘;
		if (*source == ‘-‘ || *source == ‘+‘)
			cSymbol = *source;
		//while (*source == ‘0‘)
			//source++;
		_pdata.append(1, cSymbol);
		while (*source <= ‘9‘&&*source >= ‘0‘)
		{
			if (ret <= MAX_INT)
				ret = ret * 10 + *source;
			_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())
		{
			if (_pdata[0] == bigData._pdata[0])
			{
				if (‘+‘ == _pdata[0] && _data <= MAX_INT / bigData._data || ‘-‘ == _pdata[0] && _data >= MAX_INT / bigData._data)
					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);
			}
		}
		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)
			return false;
		return true;
	}
	string Add(string s1, string s2)
	{
		int leftSize = s1.size();
		int rightSize = s2.size();
		string ret;
		char cSymbol = ‘+‘;
		if (s1[0] == s2[0])
		{
			if (s1[0] == ‘-‘)
				cSymbol = ‘-‘;
		}
		else
		{
			if (s1[0] == ‘+‘&&strcmp(s1.c_str() + 1, s2.c_str() + 1) < 0 || s1[0] == ‘-‘&&strcmp(s1.c_str() + 1, s2.c_str() + 1)>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<rightSize)
				cRes += (s2[rightSize - idx] - ‘0‘);
			cStep = cRes / 10;
			ret[leftSize - idx + 1] = cRes % 10 + ‘0‘;
		}
		ret[1] = cStep + ‘0‘;
		return ret;
	}
	string Sub(string s1, string s2)
	{
		int leftSize = s1.size();
		int rightSize = s2.size();
		char cSymbol = s1[0];
		//leftSize == rightSize &&(cSymbol == ‘+‘&&strcmp(s1.c_str() + 1, s2.c_str() + 1) < 0 || cSymbol == ‘-‘&&strcmp(s1.c_str() + 1, s2.c_str() + 1) > 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);
		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;
		}
		return ret;
	}
	string Div(string s1, string s2)
	{
		int leftSize = s1.size();
		int rightSize = s2.size();
		char cSymbol = ‘+‘;
		if (s1[0] != s2[0])
		{
			cSymbol = ‘-‘;
		}
		if (leftSize < rightSize || (leftSize == rightSize&&strcmp(s1.c_str() + 1, s2.c_str() + 1)))
		{
			return "0";
		}
		else
		{
			if ("1" == s2 || "-1" == s2)
			{
				s1[0] = cSymbol;
				return s1;
			}
		}
		char *left = (char*)(s1.c_str() + 1);
		char* right = (char*)(s2.c_str() + 1);
		int iDataLen = rightSize - 1;
		string ret;
		for (int idx = 0; idx < leftSize - 1; ++idx)
		{
			if (!IsLeftStrRight(left, iDataLen, right, rightSize - 1))
			{
				iDataLen++;
				ret.append(1, ‘0‘);
				continue;
			}
			else
			{
				ret.append(1, SubLoop(left, iDataLen, right, rightSize - 1));
				iDataLen = rightSize - 1;
			}
		}
	}
	char SubLoop(char*& left, int lSize, char* right, int rSize)
	{
		assert(left&&right);
		char cRet = ‘0‘;
		while (1)
		{
			if (!IsLeftStrRight(left, lSize, right, rSize))
				break;
			int lDataLen = lSize;
			int rDataLen = rSize;
			while (lDataLen >= 0 && rDataLen >= 0)
			{
				if (left[lDataLen] < right[rDataLen])
				{
					left[lDataLen - 1] -= 1;
					left[lDataLen] += 10;
				}
				left[lDataLen] -= right[rDataLen];
				lDataLen--;
				rDataLen--;
			}
			while (‘0‘ == *left)
			{
				left++;
				lSize--;
			}
			cRet++;
		}
	}
	bool  IsLeftStrRight(char* left, int lSize, char* right, const int rSize)
	{
		assert(left&&right);
		if (lSize>rSize || lSize == rSize&&strncmp(left, right, lSize) >= 0)
			return true;
		return false;
	}
private:
	INT_64 _data;
	string _pdata;
};
void Test1()
{
	BigData b1(1234);
	BigData b2(123456789);
	BigData  b3= b1 + b2;
	cout << b3 << endl;
}
时间: 2024-10-20 20:36:25

模拟大数据的基本计算, 以解决常规计算器计算数据时位数的有限性的相关文章

服务端、实时、大数据、AI计算

服务端.实时.大数据.AI计算,各种各样的计算,计算机本质是什么,计算机的本质是 利用compute的计算速度为人提供更优的计算结果. 所以实时也好,准实时.离线.AI本质上是两个维度,实时准实时强调计算的速度,大数据 AI强调数据量以及速度. 1.实时计算,扩量的两个方式多线程多核计算,以及多个机器.每个机器多线程多核计算. 2.大数据.AI强调数据量更多多机器进行计算,来处理多个机器计算.

大数据时代,计算模式从客户机/服务器到节点的转变

在数据库时代,计算机在分布体系中的角色有明确划分,不是客户机就是服务器,通常是一台服 务器连着多台客户机,服务器承担存储和计算的工作,客户机负责显示服务器的处理结果.高性能的计算机,比如小型机会被做为服务器,低端的计算机,如个人计 算机成为客户机.这就是以前经常说的Client/Server(客户机/服务器)结构. 到了大数据时代,这种角色已经悄然发生了变化.客户机/服务器的概念已经模糊化,被"节点"的概念取代.而这种变化的原因,归根结底,还是数据处 理需求发生了本质变化,迫使数据处理

POI实现大数据EXCLE导入导出,解决内存溢出问题

使用POI能够导出大数据保证内存不溢出的一个重要原因是SXSSFWorkbook生成的EXCEL为2007版本,修改EXCEL2007文件后缀为ZIP打开可以看到,每一个Sheet都是一个xml文件,单元格格式和单元格坐标均用标签表示.直接使用SXSSFWorkbook来到导出EXCEL本身就是POI为了大数据量导出而量身定制的,所以导出可以直接使用SXSSFWorkbook方式. 为了保险起见可以采用多Sheet的方式保证内存不溢出.需要注意的是Sheet名称不能重复:下载的时候需要定义好返回

腾讯大数据之TDW计算引擎解析——Shuffle

腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都包含了一个重要的过程-Shuffle.本文对Shuffle过程进行解析,并对两个计算引擎的Shuffle过程进行比较. 腾讯分布式数据仓库(Tencent distributed Data Warehouse, 简称TDW)基于开源软件Hadoop和Hive进行构建,并且根据公司数据量大.计算复杂等特定情况进行了大量优化和改造,目前单集群最大规模达到5600台,每日作

大数据量下的分页解决方法

最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容.再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据. sql语句分页,不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页sql: sql server: String sql = "select top " + pageSize + " * from students where id not in" + "(select t

大数据08 流计算(高速 毫秒级)

静态数据:比如数据仓库中的数据, 类似三峡水库中的水. (数据挖掘, OLAP 分析工具) 流数据:  网络监控, 传感检测, 大量的, 流式的数据(不断的产生, 源源不断的到达). 比如 PM2.5 的检测, 这种需要实时的监控和处理(分析). 流数据的特性 推送的方式: 实时查询的结果 流计算应用场景 电子商务网站, 根据用户输入, 实时分析, 然后推荐给用户分析结果. 实时交通: 实时的分析交通的情况, 给出分析导航建议. Storm 毫秒级架构 (免费开源) Topology : 就是一

“非易失性内存”嫁接“内存计算”——高速安全的大数据时代来临

“非易失性内存”嫁接“内存计算” ——高速安全的大数据时代来临 题记 数据库奠基人Jim Gray:“磁带已经死了,磁盘已经落伍,闪存成为存储,内存才是王道”.“不管磁盘是否消融,闪存都是将来的一个趋势.” 石油一直直接影响着世累经济的发展速度和发展水平,现在,信息将发挥同样的作用.<经济学人>表示:“数据和信息日益成为商业的新能源,是一种与资本.劳动力并列的新经济元素”. 数据保护 大数据时代的机遇和挑战 大数据“风华正茂” 大数据时代,每两天的数据量就达到2ZB,相当于20世纪前人类文明所

POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384列. excel2003是以二进制的方式存储,这种格式不易被其他软件读取使用:而excel2007采用了基于XML的ooxml开放文档标准,ooxml使用XML和ZIP技术结合进行文件存储,XML是一个基于文本的格式,而且ZIP容器支持内容的压缩,所以其一大优势是可以大大减小文件的尺寸. 2. 大批

典型大数据计算模式与系统

典型大数据计算模式 典型系统 大数据查询分析计算 HBase,Hive,Cassandra,Impala,Shark,Hana等 批处理计算 Hadoop MapReduce,Spark等 流式计算 Scribe,Flume,Storm,S4, Spark Steaming等 迭代计算 HaLoop,iMapReduce,Twister,Spark等 图计算 Pregel,Giraph,Trinity,PowerGraph,GraphX等 内存计算 Dremel,Hana,Spark等