大整数乘法


大整数 乘法运算: 
乘法:其实乘法很简单,对于加法 进位放在下一位。但是对于乘法,如果数学功底扎实,就可以用连乘式推出以下结论:
   n位数乘m位数 那么最多有(n+m)位。
于是将数据存至数组中,那么就有
 c[i+j]+=a[i]*b[j]
if(c[i+j]>=10)//当然对于结果数组长度申请最好为 len_a+len_b+1
{
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
<p>理论讲不太清楚,也不知道如何图解,大家直接看代码吧!代码可能较长,耐心看很容易看懂!</p><p>时间复杂度:O(n^2)   空间复杂度O(n)</p>
//大数乘法 简化运算
#include<iostream>
#include<string>
#include<cassert>
using namespace std;
int* TransStrToNumber(string& Ref);//字符串转换为数组
bool IsPostive(string& Ref1, string& Ref2);//判断结果是否为正数
int* SupMultip(string& Ref, string& Ref2);//大数相乘
void Print(int* pResult,int len,bool IsPostive);//输出函数

int* TransStrToNumber(string& Ref)
{
	assert("" != Ref);
	if ('+' != Ref[0] && '-' != Ref[0])
	{
		//Ref.insert(1, "+");//将用户输入的字符串 插入一个符号 
		//第一个参数是插在该位置之前 第二个参数必须为常量字符串
		//这种方法无法插入在第一个位置
		Ref = "+" + Ref;
	}
	int len = Ref.length()-1;//字符串长度比数组多1
	int *pNumber = new int[len]();
	if (NULL == pNumber)
	{
		exit(0);
	}
	for (int j=len;j>=1; --j)
	{
		pNumber[len-j] = Ref[j] - 48;// 输入习惯是高位在前 而低位在后 但是为了简化计算 低位应该凡在前面
	}
	return pNumber;
}

bool IsPostive(string& Ref1, string& Ref2)
{
	int MinusCount = 0;
	bool IsPostive = true;
	if ( '-' == Ref1[0])
	{
		++MinusCount;
	}
	if ( '-' == Ref2[0])
	{
		++MinusCount;
	}
	if (1 == MinusCount % 2)
	{
		IsPostive = false;
	}
	return IsPostive;
}

int* SupMultip(string& Ref1, string& Ref2)
{
	int* pNumber1 = TransStrToNumber(Ref1);
	int* pNumber2 = TransStrToNumber(Ref2);
	int len1 = Ref1.length()-1;//字符串多了一个符号位
	int len2 = Ref2.length()-1;
	int* pResult = new int[len1+len2+1]();
	memset(pResult, 0, sizeof(int)*(len1 + len2+1));
	if (NULL == pResult)
	{
		//exit(0);//可能内存申请失败
		return NULL;
	}
	for (int i = 0; i < len1; ++i)
	{
		for (int j = 0; j < len2; ++j)
		{
			pResult[i + j] += pNumber1[i] * pNumber2[j];//一定注意是+=
		}
	}
	for (int i = 0; i < len1 + len2; ++i)
	{
		pResult[i + 1] += pResult[i] / 10;
		pResult[i] = pResult[i] % 10;
	}
	delete[] pNumber1;
	delete[] pNumber2;
	bool IsPostiveNumber = IsPostive(Ref1,Ref2);
	Print(pResult, len1 + len2+1,IsPostiveNumber);
	return pResult;
}

void Print(int* pResult,int len, bool IsPostive)
{
	if (NULL == pResult)
	{
		exit(0);
	}
	int i = len-1;
	while (i>=0&&0 == pResult[i])
	{
		--i;//循环跳出时 就是第一个不为0的数字
	}
	if (-1 == i)
	{
		cout << "0" << endl;
		return;
	}
	if (IsPostive)
	{
		cout << "+";
	}
	else
	{
		cout << "-";
	}
	for (i; i >= 0; --i)
	{
		cout << pResult[i] << " ";
	}
	cout << endl;
	//delete[] pResult;
}
int main(void)
{
	string str1 = "111111111111111";
	string str2 = "-10000";
	cin >> str1>>str2;
	int*pRef=SupMultip(str1, str2);
	if (pRef != NULL)
	{
		delete[] pRef;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值