高精度乘法c++代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
struct node{int d[100000],l;};
char s[1000000];
node a,b,c;
void read(node &x)
{
    scanf("%s",s);
    x.l=strlen(s);
    memset(x.d,0,sizeof(x.d));
    for (int i=0;i<x.l;i++)
      x.d[x.l-i-1]=s[i]-'0';
}
int main()
{
    read(a);read(b);
    // if (la>lb) lc=la;else lc=lb;
    memset(c.d,0,sizeof(c.d));
    for (int i=0;i<a.l;i++)
    {
        for (int j=0;j<b.l;j++)
          c.d[i+j]+=a.d[i]*b.d[j];
    }
    c.l=a.l+b.l-1;
    for (int i=0;i<c.l;i++)
    {
        c.d[i+1]+=c.d[i]/10;
        c.d[i]%=10;
    }
    while (c.d[c.l]>0) 
    {
        c.d[c.l+1]=c.d[c.l]/10;
        c.d[c.l]%=10;
        c.l++;
    }
    while (c.l>1 && c.d[c.l-1]==0) c.l--;
    for (int i=c.l-1;i>=0;i--)
      printf("%d",c.d[i]);
    return 0;
}
    分治(仅函数)
    list<char> Mul(list<char> num1,list<char> num2)  // 分治法求两大数的积  
{  
    list<char> ans;  
    int sign = 0;  
    int len1,len2,len;  
    list<char>::iterator iter1,iter2,iter;  
    list<char> high,low;  
    list<char> anshigh,anslow;  
    int th,tl;  
    int i,j,k;  
    //print(num1);cout << endl;  
    //print(num2);cout << endl;  
    if(num1.size() == 1 && num2.size() == 1)     //如果两数都已是一位数,则进行运算  
    {  
        th = *(num1.begin()) - '0';  
        tl = *(num2.begin()) - '0';  
        th *= tl;  
        ans.push_front( th % 10 + '0');  
        ans.push_front( th / 10 + '0');  
        return ans;  
    }  
    else if(num1.size() == 1 && num2.size() > 1)            //如果num1位数大于1,则对Num1分治求积  
    {  
         if(*(num2.begin()) == '-')  
           {  
                sign = 1;  
                num2.pop_front();  
           }  
         len2 = num2.size();  
         if(len2 == 1)  
         {  
            ans = Mul(num1,num2);  
            if(sign)  
                ans.push_front('-');  
         }  
         else  
         {  
            for(iter= num2.begin(),i = 0; i < len2 / 2; i++,iter++)  
            {  
                high.push_back(*iter);  
            }  
            for(;iter!=num2.end();iter++)  
            {  
                low.push_back(*iter);  
            }  
            len = low.size();  
            anshigh = Mul(num1,high);                 //num1分为两部分,high,low  
            anslow = Mul(num1,low);  
            for(i = 0; i < len; i++)  
                anshigh.push_back('0');  
            ans = Add(anshigh,anslow);                 //合并结果  
            if(sign)  
                ans.push_front('-');  
         }  
         return ans;  
    }  
    else if(num2.size() == 1 && num1.size() > 1)              //如果num2位数大于1,则对Num2分治求积  
    {  
         if(*(num1.begin()) == '-')  
           {  
                sign = 1;  
                num1.pop_front();  
           }  
         len1 = num1.size();  
         if(len2 == 1)  
         {  
            ans = Mul(num1,num2);  
            if(sign)  
                ans.push_front('-');  
         }  
         else  
         {  
            for(iter= num1.begin(),i = 0; i < len1 / 2; i++,iter++)  
            {  
                high.push_back(*iter);  
            }  
            for(;iter!=num1.end();iter++)  
            {  
                low.push_back(*iter);  
            }  
            len = low.size();  
            anshigh = Mul(num2,high);                   //num2分为两部分,high,low  
            anslow = Mul(num2,low);  
            for(i = 0; i < len; i++)  
                anshigh.push_back('0');  
            ans = Add(anshigh,anslow);                    //合并结果  
            if(sign)  
                ans.push_front('-');  
         }  
         return ans;  
    }                                                       //如果两数位数都大于1,则都运用分治  
    else  
    {  
        list<char> num1high,num1low,num2high,num2low;  
        int flag1 = 0,flag2 = 0;  
        if(*(num1.begin()) == '-')  
        {  
            flag1 = 1;  
            num1.pop_front();  
        }  
        if(*(num2.begin()) == '-')  
        {  
            flag2 = 1;  
            num2.pop_front();  
        }  
        if((flag1 == 1 && flag2 == 0)||(flag1 == 0 && flag2 == 1))  //如果有一正一负,则标记结果为负  
        {  
            sign = 1;  
        }  
        len1 = num1.size();  
        len2 = num2.size();  
        if(len1 == 1 || len2 == 1)                 //如果有一个数是一位数,则直接递归调用  
        {  
            ans = Mul(num1,num2);  
            if(sign)  
                ans.push_front('-');  
        }  
        else  
        {                                                //否则分治法求  
            for(iter = num1.begin(),i = 0; i < len1 / 2; iter++,i++)  
                num1high.push_back(*iter);            //被乘数高位部分  
            for( ; iter != num1.end(); iter++)  
                num1low.push_back(*iter);                 //被乘数低位部分  
            for(iter = num2.begin(),i = 0; i < len2 / 2; iter++,i++)  
                num2high.push_back(*iter);                  //乘数高位部分  
            for( ; iter != num2.end(); iter++)  
                num2low.push_back(*iter);                    //乘数低位部分  
            int a = (len1 + 1) / 2;  
            int b = (len2 + 1) / 2;  
            list<char> AC,AD,BC,BD;  
            //print(num2high);cout << endl;  
            //print(num2low);cout << endl;  
            AC = Mul(num1high,num2high);                  //运用X=A*10^a + B; Y= C*10^b + D;  
            AD = Mul(num1high,num2low);                   // X*Y = AC * 10 ^(a+b) + AD *10^a + BC * 10 ^b + BD公式求  
            BC = Mul(num1low,num2high);  
            BD = Mul(num1low,num2low);  
            for(i = 0; i < a + b; i++)  
                AC.push_back('0');  
            for(i = 0; i < a; i++)  
                AD.push_back('0');  
            for(i = 0; i < b; i++)  
                BC.push_back('0');  
            ans = Add(AC,AD);  
            ans = Add(ans,BC);  
            ans = Add(ans,BD);                            //累加结果  
            if(sign)  
                ans.push_front('-');  
        }  
        return ans;  
    }  
}
还有一种:

#include<iostream>
#include<string>
using namespace std;
int x[50000], y[50000], z[250000000]={0}, p=0;
//数组开到50000,支持50000位乘50000位的算式,代价就是占内存。 
int main()
{    
    string a,b;    
    cin>>a>>b;//输入因数     
    for(int i=0; i<a.size(); i++){
        x[i] = a[a.size()-i-1]-48;
    }   
    for(int i=0; i<b.size(); i++){
        y[i] = b[b.size()-i-1]-48;
    }//这两步是把字符串转换成 数字,存在一个数组里。    
    //这样方便计算,但是如果不转换也可以,只是麻烦一些。     
    for(int i=0; i<a.size(); i++){        
        for(int j=0; j<b.size(); j++){            
            z[i+j] += x[i]*y[j];//将积存在另一个数组里。             
            while(z[i+j] > 9)
                    z[i+j]-=10,z[i+j+1]++;//进位        
        }    
    }    
    for(int i=a.size()+b.size()-1; i>=0; i--){  //输出
      if(z[i]==0 && p==0 && i!=0)
            continue;//判断最高位是否是0,如果是则不输出。         
        else 
            p=1;        
        cout<<z[i];    
    }    
    return 0;//最好还是返回一下,养成好习惯。 
}

  • 46
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值