大数据的乘法和加法

由于编程语言常用类型的位数限制,精度收到很大的局限。只能在一定的数据范围内进行运算,超出这个范围回导致数据失真。

在进行图像编码的过程遇到了这样问题,写了两个小程序,很多地方都需要优化,不过在一定的测试条件下还可以用。

 

/功能:大数据相乘
//参数:相乘的两个数,用vector存储数据的每一位
//返回:相乘结果,用一个vector存储结果的每一位
vector<int> MyMath::BigDataMul(const vector<int> &InputData1,const vector<int> &InputData2)
{
	vector<vector<int>> DataBuffer;
	vector<int> mdataBuffer;
	for (unsigned int i(0);i<InputData2.size();i++)
	{
		int midBit = InputData2[i];
		int giveBit(0);
		for (unsigned int j(0);j<InputData1.size();j++)
		{
			mdataBuffer.push_back(giveBit + InputData1[j]*midBit%10);
			giveBit = InputData1[j]*midBit/10;
		}
		if (giveBit)
		{
			mdataBuffer.push_back(giveBit);
		}
		DataBuffer.push_back(mdataBuffer);
		mdataBuffer.clear();
	}
	mdataBuffer = DataBuffer[0];
	int Themid;
	for (unsigned int i(1);i<DataBuffer.size();i++)
	{
		unsigned int mdataBufferSize = mdataBuffer.size();
		unsigned int j(i),k(0),GiveBit(0);
		for (;j<mdataBufferSize;j++,k++)
		{
			Themid = mdataBuffer[j] + DataBuffer[i][k] + GiveBit;
			GiveBit = Themid/10;
			mdataBuffer[j] = Themid%10;
			if (j == mdataBufferSize-1)
			{
				if (k == DataBuffer[i].size()-1&&GiveBit)
				{
					mdataBuffer.push_back(GiveBit);
				}
				else 
				{
					for (unsigned int l(k+1);l<DataBuffer[i].size();l++)
					{
						int Themid1 = GiveBit + DataBuffer[i][l];
						mdataBuffer.push_back(Themid1%10);
						GiveBit = Themid1/10;
					}
					if (GiveBit)
					{
						mdataBuffer.push_back(GiveBit);
					}
				}
			}
		}
		
	}
	return mdataBuffer;
}

//功能:大数据相加
//参数:相加的两个数,用vector存储数据每一位
//返回:两数的和,用vector存储结果每一位
vector<int> MyMath::BigDataAdd(const vector<int> &InputData1,const vector<int> &InputData2)
{
	vector<int> AddResult;
	int nData1Size = InputData1.size();
	int nData2Size = InputData2.size();
	int GiveBit(0);
	if (nData1Size>nData2Size)
	{
		int nSizeDiff = nData1Size - nData2Size;
		AddResult = InputData1;
		for (int i(0);i<nData2Size;i++)
		{
			int temp = InputData2[i] + InputData1[i+nSizeDiff] + GiveBit;
			AddResult[i+nSizeDiff] = temp%10;
			GiveBit = temp/10;
		}
		if (GiveBit)
		{
			AfxMessageBox(_T("相加之后越界,不再纯小数,请校验输入和输出"));
		}
	}
	else
	{
		int nSizeDiff = nData2Size - nData1Size;
		AddResult = InputData2;
		for (int i(0);i<nData1Size;i++)
		{
			int temp = InputData1[i] + InputData2[i+nSizeDiff] + GiveBit;
			AddResult[i+nSizeDiff] = temp%10;
			GiveBit = temp/10;
		}
		if (GiveBit)
		{
			AfxMessageBox(_T("相加之后越界,不再纯小数,请校验输入和输出"));
		}
	}
	return AddResult;
}

 

 

 

乘法思想就是用第一个数的每一位对第二个数进行相乘,并把结果存储下来,然后对这些结果进行错位相加。

加法的思想就是按位相加,注意位数和进位就好了。这里用的是vector进行性能分析的时候,相当耗时和内存。可以考虑采用其他数据结构进行实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值