大数相乘

来源:互联网 发布:java asm 官网 编辑:程序博客网 时间:2024/06/10 01:44

两个大数相乘,可以分解为一个大数因子乘以另一个分解的了大数因子,即乘以后面大数因子的各个位的数,根据对应位进位。

第一种方法:

一、先将第一个因子转换成对应第二个因子对应应该进位的n个因子(比如123*222先将123转换成123,,1230,,12300三个数)

二、然后用前面转化的n个因子分别乘以第二个因子各个位上面的数

三、然后在一一进行大数求和的运算,得出结果

明显这样做的话内存和时间的开销都比较大,数据大了肯定行不通。

第二种方法:

一、直接将两个大数低位对齐(和大数加法类似),根据字符串遍历移位的特点一遍乘一边加(结果默认一个全是零的串)

二、进行进位操作

明显这第二个方法内存时间都节约很多。

核心部分代码:

//multiplyer    for(string::size_type i = 0;i < str1.length();i ++)        for(string::size_type j = 0; j < str2.length();j ++)            ans[i+j] += (str1[i]-'0')*(str2[j]-'0');

样例:

input

99999 99999

12345 2

54321 2

output

9999800001

24690

108642

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;#define MAXN 2000int ans[MAXN];int lenth;//reverse stringvoid reverse_str(string &str1){    for(string::size_type i = 0,j = str1.length()-1;i < j;i++,j--)    {        char ch = str1[i];        str1[i] = str1[j];        str1[j] = ch;    }}//mutiplyer two big numbervoid add_number(string const str1,string const str2){    memset(ans,0,MAXN);    lenth = str1.length() + str2.length();    //multiplyer    for(string::size_type i = 0;i < str1.length();i ++)        for(string::size_type j = 0; j < str2.length();j ++)            ans[i+j] += (str1[i]-'0')*(str2[j]-'0');    //carry    for(int i = 0;i < lenth;i ++)    {        if(ans[i]>9)        {            int val = ans[i]/10;            ans[i] %= 10;            ans[i+1] += val;        }    }    if(ans[lenth-1] == 0)    {        lenth--;    }    //print answer//    for(int i = lenth-1;i>=0;i--)//    {//        printf("%d",ans[i]);//    }//    cout<<endl;}//print answervoid print_ans(){    int flag = 1;    for(int i = lenth-1;i >= 0;i --)    {        if(i == lenth-1&&ans[i] == 0)        {            flag = 0;        }        if(ans[i]!=0)        {            flag = 1;        }        if(flag)        {            printf("%d",ans[i]);        }    }    printf("\n");}int main(){//    freopen("test.in","r",stdin);//    freopen("test.out","w",stdout);    string str1,str2;    while(cin>>str1>>str2)    {        reverse_str(str1);        reverse_str(str2);        add_number(str1,str2);        print_ans();    }    return 0;}



原创粉丝点击