您的位置:首页 > 其它

分治--大数相乘

2013-10-28 00:40 369 查看
题目:大数相乘,例如: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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: