大数乘法

乘积是逐位相乘,也就是aibj,结果加入到积C的第i+j位,最后处理进位即可,例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同。B=25 = 2*10 + 5 = (5, 2);C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2) = (5, 22, 2) = (5, 2. 4)=425。

原博客的思路为:
(1)转换并反转,字符串转换为数字并将字序反转;

(2)逐位相乘,结果存放在result_num[i+j]中;

(3)处理进位,消除多余的0;

(4)转换并反转,将计算结果转换为字符串并反转。

 原博客中采用指针参数传递,字符串长度有限制,改为通过string传参数,

 上面的思路还是很清晰的,但代码有些过长,考虑优化如下:

(1)上述思路是先转换反转,其实无需先将全部字符串转换为数字的,可即用即转,节约空间;

(2)无需等到逐位相乘都结束,才处理进位,可即乘即进;

(3)无需等到所有结果出来后,将结果转换为字符,可即乘即转。

 优化后时间复杂度不变,但节省了空间,代码更简洁。如下:

头文件和数据结构:

#include   
#include   
#include   
#include   
#include   
using namespace std;  
struct bigcheng2  
{  
    string a;  
    string b;  
    string result_str;  
};  
void reverse_data( string &data);//字符串反转  
void multiply2(bigcheng2 &tempcheng2);//字符串模拟相乘  

字符串反转:

void reverse_data( string &data)  
{  
    char temp = '0';  
    int start=0;  
    int end=data.size()-1;  
    assert( data.size()&& start <= end );  
    while ( start < end )  
    {  
        temp = data[start];  
        data[start++] = data[end];  
        data[end--] = temp;  
    }  
} 

两数相乘:

void multiply2(bigcheng2 &tempcheng2)  
{  
    reverse_data(tempcheng2.a);//字符串反转  
    reverse_data(tempcheng2.b);  
    int c=0;  
    string temp(tempcheng2.a.size()+tempcheng2.b.size(),'0');//将temp全部初始化为0字符  
    for (unsigned int i=0;isize();i++)  
    {  
        unsigned int j;  
        for (j=0;jsize();j++)  
        {  
            c+=temp[i+j]-'0'+(tempcheng2.a[i]-'0')*(tempcheng2.b[j]-'0');//注意temp[i+j]可能保存有上一次计算的结果  
            temp[i+j]=(c%10)+'0';//将结果转换为字符  
            c=c/10;  
        }  
        while(c)  
        {  
            temp[i+j++]+=c%10;//temp里已存字符  
            c=c/10;  
        }  
    }  
    for (int i=temp.size()-1;i>=0;i--)  
    {  
        if (temp[i]!='0')  
            break;  
        else  
            temp.pop_back();  
    }  
    reverse_data(temp);//结果?字Á?符¤?串ä?反¤¡ä转Áa  
    tempcheng2.result_str=temp;  
}  

主函数:

int main()  
{  
       bigcheng2 tempcheng2;  
       string a,b;  
       cin>>a>>b;  
       tempcheng2.a=a;  
       tempcheng2.b=b;  
       multiply2(tempcheng2);  
       cout<system("pause");  
       return 0;  
}  

你可能感兴趣的:(算法,算法)