2的冪位元大整數分治演算法

來源:互聯網
上載者:User

標籤:2的冪位元大整數分治演算法

#include <iostream>#include <cstring>#include <string>#include <cstdio>using namespace std;//500 digits at moststruct Num{    int num[1000],len;    Num(){        memset(num,0,sizeof(num));        len=1;    }    Num(const string &s){        len=s.size();        for(int i=0;i<len;++i){            num[i]=s[len-1-i]-'0';        }    }    Num& operator=(const Num& right){        copy(right.num,right.num+1000,this->num);        len=right.len;        return *this;    }    friend ostream& operator<<(ostream &os,const Num &output){        for(int i=output.len-1;i>=0;--i)            os<<output.num[i];        return os;    }    friend Num operator+(Num &x,Num &y){        Num ans;        ans.len=max(x.len,y.len);        for(int i=0;i<ans.len;++i){            ans.num[i]=x.num[i]+y.num[i];        }        for(int i=0;i<ans.len;++i){            ans.num[i+1]+=ans.num[i]/10;            ans.num[i]%=10;        }        if(ans.num[ans.len]) ++ans.len;        return ans;    }    friend Num operator-(const Num &left,const Num& right){        Num ans;        ans.len=max(left.len,right.len);        for(int i=0;i<ans.len;++i)            ans.num[i]=left.num[i]-right.num[i];        for(int i=0;i<ans.len;++i){            if(ans.num[i]<0){                --ans.num[i+1];                ans.num[i]+=10;            }        }        while(ans.len>=1 && !ans.num[ans.len-1]) --ans.len;        return ans;    }    friend Num mul(const Num &x,const Num &y){        if(x.len==1 && y.len==1) return to_string(x.num[0]*y.num[0]);        Num a,b,c,d,ans;        int maxlen=max(x.len,y.len),len1=maxlen>>1;        copy(x.num,x.num+len1,b.num);        b.len=len1;        copy(x.num+len1,x.num+maxlen,a.num);        a.len=maxlen-len1;        copy(y.num,y.num+len1,d.num);        d.len=len1;        copy(y.num+len1,y.num+maxlen,c.num);        c.len=maxlen-len1;        Num tem_ac=mul(a,c),tem_bd=mul(b,d),ac,bd,fin_cdab;        Num cdab=mul(c+d,a+b)-tem_ac-tem_bd;        copy(tem_ac.num,tem_ac.num+tem_ac.len,ac.num+len1*2);        ac.len=tem_ac.len+2*len1;        copy(cdab.num,cdab.num+cdab.len,fin_cdab.num+len1);        fin_cdab.len=cdab.len+len1;        ans=ac+fin_cdab;        ans=ans+tem_bd;        while(ans.len>1 && !ans.num[ans.len-1]) --ans.len;        return ans;    }    friend Num operator*(const Num &x,const Num &y){        return mul(x,y);    }};int main(){    string a,b;    while(cin>>a>>b){        Num x=a,y=b;        cout<<"***************************************************"<<endl;        cout<<a<<endl<<"*"<<endl<<b<<endl<<"="<<endl<<x*y<<endl;        cout<<"***************************************************"<<endl;    }    return 0;}

2的冪位元大整數分治演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.