高精度类模板

高精度除法速度太慢了,还仍需优化

  1 #include<iostream>
  2 #include<vector>
  3 #include<cmath>
  4 #include<string>
  5 #include<iomanip>
  6 #include<algorithm>
  7 using namespace std;
  8 
  9 #define MAXN 10000
 10 #define DLEN 4
 11 
 12 class BigNum
 13 {
 14 private:
 15     vector<int> A;
 16     bool FLAG;
 17     char cmp(const BigNum &,bool)const;
 18     void TRIM(){while(!A.empty()&&!A.back())A.pop_back();if(A.empty())FLAG=0;}
 19 public:
 20     BigNum(){FLAG=0;}
 21     BigNum(long long);
 22     void swap(BigNum &T){std::swap(FLAG,T.FLAG);A.swap(T.A);}
 23     void operator=(const BigNum &T){FLAG=T.FLAG;A=T.A;}
 24     void operator=(const string &);
 25     friend istream& operator>>(istream &,BigNum &);
 26     friend ostream& operator<<(ostream &,BigNum);
 27     bool   operator>(const BigNum &T){return this->cmp(T,0)>0;}
 28     bool   operator<(const BigNum &T){return this->cmp(T,0)<0;}
 29     BigNum operator-()const{BigNum T=*this;T.FLAG=~FLAG;return T;}
 30     BigNum abs()const{BigNum T=*this;T.FLAG=0;return T;}
 31     BigNum operator+(const BigNum &) const;
 32     BigNum operator-(const BigNum &) const;
 33     BigNum operator*(const BigNum &) const;
 34     BigNum operator/(const BigNum &)const;
 35     void operator+=(const BigNum &v){*this=*this+v;}
 36     void operator-=(const BigNum &v){*this=*this-v;}
 37     void operator*=(const BigNum &v){*this=*this*v;}
 38     void operator/=(const BigNum &v){*this=*this/v;}
 39     BigNum operator+(const long long a) const{return *this+BigNum(a);}
 40     BigNum operator-(const long long a) const{return *this-BigNum(a);}
 41     BigNum operator*(const long long a) const{return *this*BigNum(a);}
 42     BigNum operator/(const long long a) const{return *this/BigNum(a);}
 43 };
 44 
 45 char BigNum::cmp(const BigNum &a,bool flag)const
 46 {
 47     if(flag==0)
 48     {
 49         if(FLAG<a.FLAG) return 1;
 50         if(FLAG>a.FLAG) return -1;
 51     }
 52     char F=!FLAG||flag?1:-1;
 53     if(A.size()>a.A.size()) return F;
 54     if(A.size()<a.A.size()) return -F;
 55     for(int i=max(A.size(),a.A.size())-1;i>=0;i--)
 56     {
 57         if(A[i]>a.A[i]) return F;
 58         if(A[i]<a.A[i]) return -F;
 59     }
 60     return 0;
 61 }
 62 
 63 BigNum::BigNum(long long a)
 64 {
 65     FLAG=0;
 66     if(a<0) FLAG=1,a=-a;
 67     for(;a;a/=MAXN)
 68         A.push_back(a-(a/MAXN)*MAXN);
 69 }
 70 
 71 void BigNum::operator=(const string &s)
 72 {
 73     int len=0,n=0,m=0;
 74     if(s[0]=='-') FLAG=1,len=1;
 75     for(int i=s.size()-1;i>=len;i--)
 76     {
 77         if(m==DLEN) A.push_back(n),m=0,n=0;
 78         n+=(s[i]-'0')*pow(10,m);
 79         m++;
 80     }
 81     if(n>0)A.push_back(n);
 82 }
 83 
 84 istream& operator>>(istream &in,BigNum &T)
 85 {
 86     string s;
 87     in>>s;
 88     T=s;
 89     return in;
 90 }
 91 
 92 ostream& operator<<(ostream &out,BigNum T)
 93 {
 94     if(T.FLAG) out<<'-';
 95     out<<T.A[T.A.size()-1];
 96     for(int i=T.A.size()-2;i>=0;i--)
 97     {
 98         out.width(DLEN);
 99         out.fill('0');    
100         out<<T.A[i];
101     }
102     return out;
103 }
104 
105 BigNum BigNum::operator+(const BigNum &T) const
106 {
107     if(FLAG==T.FLAG)
108     {
109         BigNum t(*this);
110         int j=max(A.size(),T.A.size());
111         for(int i=0,is=0;i<j||is;i++)
112         {
113             if(i==t.A.size()) t.A.push_back(0);
114             t.A[i]+=is+(i<T.A.size()?T.A[i]:0);
115             is=t.A[i]>=MAXN;
116             if(is)t.A[i]-=MAXN;
117         }
118         return t;
119     }else return *this-(-T);
120 }
121 
122 BigNum BigNum::operator-(const BigNum &T) const
123 {
124     if(FLAG==T.FLAG)
125     {
126         if(~cmp(T,1))
127         {
128             BigNum t(*this);
129             for(int i=0,is=0;i<T.A.size()||is;i++)
130             {
131                 t.A[i]-=is+(i<T.A.size()?T.A[i]:0);
132                 is=t.A[i]<0;
133                 if(is) t.A[i]+=MAXN;
134             }
135             t.TRIM();
136             return t;
137         }else return -(T-*this);
138     }else return *this+(-T);
139 }
140 
141 BigNum BigNum::operator*(const BigNum &T) const
142 {
143     BigNum t;
144     t.A.resize(A.size()+T.A.size());
145     for(int i=0;i<A.size();i++)
146         for(int j=0;j<T.A.size();j++)
147         {
148             t.A[i+j]+=A[i]*T.A[j];
149             if(t.A[i+j]>=MAXN)
150             {
151                 t.A[i+j+1]+=t.A[i+j]/MAXN;
152                 t.A[i+j]-=(t.A[i+j]/MAXN)*MAXN;
153             }
154         }
155     t.TRIM();
156     t.FLAG=FLAG*T.FLAG;
157     return t;
158 }
159 
160 BigNum BigNum::operator/(const BigNum &T)const
161 {
162     switch(this->cmp(T,1))
163     {
164         case -1:
165             return 0;
166         case 0:
167             return 1;
168         case 1:
169             BigNum a(*this),b,c,d;
170             long long n=this->A.size()-T.A.size();
171             for(int i=n;i>=0;i--)
172             {
173                 c=pow(10,i);
174                 b=T*c;
175                 while((a-b).FLAG==0)
176                 {
177                     a=a-b;
178                     d+=c;
179                 }
180             }
181             return d;
182     }
183     return -1;
184 }
原文地址:https://www.cnblogs.com/InWILL/p/5847406.html