当前位置:编程学习 > C/C++ >>

分治--大数相乘

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



补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,