高精度模版:加,减,乘,带余除法

来源:互联网 发布:淘宝店如何找货源 编辑:程序博客网 时间:2024/06/04 20:12
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<vector>using namespace std;const int N=100005;char s[N];struct Wint:vector<int>{    Wint(int n=0)    {        push_back(n);        check();    }    void check()    {        while(!empty()&&!back()) pop_back();        if(empty()) return;        for(int i=1;i<size();i++)        {            (*this)[i]+=(*this)[i-1]/10;            (*this)[i-1]%=10;        }        while(back()>=10)        {            push_back(back()/10);            (*this)[size()-2]%=10;        }     }};bool operator==(const Wint &A,const Wint &B){    if(A.size()!=B.size()) return 0;    for(int i=0;i<A.size();i++)     if(A[i]!=B[i]) return 0;    return 1;}bool operator<(const Wint &A,const Wint &B){    if(A.size()!=B.size()) return A.size()<B.size();    for(int i=A.size()-1;i>=0;i--)     if(A[i]!=B[i]) return A[i]<B[i];    return 0;}bool operator>=(const Wint &A,const Wint &B){    return !(A<B);}Wint operator+(const Wint &A,const Wint &B){    Wint C=A;     if(C.size()<B.size()) C.resize(B.size());    for(int i=0;i<B.size();i++)    C[i]+=B[i];    C.check();    return C;   }Wint operator-(const Wint &A,const Wint &B)  //A>B{    Wint C=A;    for(int i=0;i<B.size();i++)    {        if(C[i]<B[i])        {            int j=i+1;            while(C[j]==0) j++;            while(j>i) {C[j]--; C[--j]+=10;}        }        C[i]-=B[i];    }    C.check();    return C;}Wint operator*(const Wint &A,const Wint &B){    Wint C; C.assign(A.size()+B.size(),0);    for(int i=0;i<A.size();i++)    for(int j=0;j<B.size();j++) C[i+j]+=A[i]*B[j];    C.check();    return C;}Wint operator/(Wint &A,const Wint &B) // %{    Wint ans;    int top=A.size()-B.size();    for(int t=top;A>=B&&t>=0;t--)    {        Wint C;        C.assign(t,0);        C.push_back(1);        Wint D=C*B;        while(A>=D)        {             A=A-D;            ans=ans+C;        }    }     ans.check();    return ans;}Wint operator%(Wint &A,const Wint &B) // %{    int top=A.size()-B.size();    for(int t=top;A>=B&&t>=0;t--)    {           Wint C;        C.assign(t,0);        C.push_back(1);        Wint D=C*B;        while(A>=D) A=A-D;      }     A.check();    return A;}int main(){    Wint A; Wint B;    scanf("%s",s); int len=strlen(s);    for(int i=len-1;i>=0;i--) A.push_back(s[i]-'0');    scanf("%s",s); len=strlen(s);    for(int i=len-1;i>=0;i--) B.push_back(s[i]-'0');    Wint C=A%B;    if(C.empty()) C.push_back(0);    for(int i=C.size()-1;i>=0;i--)    printf("%d",C[i]);}
原创粉丝点击