分治--大数相乘

题目:大数相乘,例如:a=423405293459和b=323452345234533相乘a*b。

这里我们采用分治的思想:

1:将该问题分成b的每个数和a相乘。

2:将每个数和a相乘得到结果存入一个数组中,每个数对应一个数组。

3:合并每个数组,相加。。

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string a="423405293459";
	string b="323452345234533";
	
	int length_a=a.length();
	int length_b=b.length();
	int offset=-1;
	char* data=new char[length_b*(length_a+length_b)];//记录每个b的元素值乘以a的每个元素的二维数组(可以这么理解)
	memset(data,'0',length_b*(length_a+length_b));
	int count;
	int i;
	int j;
	int flag;
	for(i=length_b-1;i>=0;i--)
	{
		offset++;//因为每次b乘以a的起始位置都要往左偏移一位,记录当前应该偏移多少位
		count=-1;//记录当前乘以a元素的位置
		flag=0;
		for(j=length_a-1;j>=0;j--)
		{
			count++;
			data[(length_b-1-i)*(length_a+length_b)+(length_a+length_b-1)-offset-count]=((b[i]-'0')*(a[j]-'0')+flag)%10+'0';
			flag=((b[i]-'0')*(a[j]-'0')+flag)/10;
		}
		count++;
		data[(length_b-1-i)*(length_a+length_b)+(length_a+length_b-1)-offset-count]=flag+'0';//保证本次相乘的最后的进位也要存进去
		for(int m=0;m<length_a+length_b;m++)
			cout<<data[(length_b-1-i)*(length_a+length_b)+m]<<" ";//测试用的,方便我们观察
		cout<<endl;
	}
	char* temp=new  char[length_a+length_b+1];
	temp[length_a+length_b]=0;
	memset(temp,'0',length_a+length_b);
	int index=length_a+length_b-1;
	flag=0;
	int num;
	for(i=(length_a+length_b-1);i>=0;i--)
	{
		num=0;
		for(j=0;j<length_b;j++)
		{
			num+=(data[j*(length_a+length_b)+i]-'0');
		}
		num+=flag;
		temp[index--]=num%10+'0';
		flag=num/10;
	}
	char* result=temp;
	while(*result=='0')
		result++;
	cout<<result<<endl;
}


你可能感兴趣的:(分治--大数相乘)