1. 程式人生 > >分治法---大整數相乘

分治法---大整數相乘

題目:大數相乘,例如: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;
}