模板汇总——大数

 

 

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn=10005;/*精度位数,自行调整*/
  4 //1.如果需要控制输出位数的话,在str()里面把len调成需要的位数
  5 //2.很大的位数是会re的,所以如果是幂运算的话,如 计算x^p的位数n, n=p*log(10)x+1;(注意要加一)
  6 //3.还可以加上qmul,取模的过程也就是str(),c_str()再搞一次
  7 class bign
  8 {
  9     //io*2 bign*5*2 bool*6
 10     friend istream& operator>>(istream&,bign&);
 11     friend ostream& operator<<(ostream&,const bign&);
 12     friend bign operator+(const bign&,const bign&);
 13     friend bign operator+(const bign&,int&);
 14     friend bign operator*(const bign&,const bign&);
 15     friend bign operator*(const bign&,int&);
 16     friend bign operator-(const bign&,const bign&);
 17     friend bign operator-(const bign&,int&);
 18     friend bign operator/(const bign&,const bign&);
 19     friend bign operator/(const bign&,int&);
 20     friend bign operator%(const bign&,const bign&);
 21     friend bign operator%(const bign&,int&);
 22     friend bool operator<(const bign&,const bign&);
 23     friend bool operator>(const bign&,const bign&);
 24     friend bool operator<=(const bign&,const bign&);
 25     friend bool operator>=(const bign&,const bign&);
 26     friend bool operator==(const bign&,const bign&);
 27     friend bool operator!=(const bign&,const bign&);
 28 
 29 private://如果想访问len,改成public
 30     int len,s[maxn];
 31 public:
 32     bign()
 33     {
 34         memset(s,0,sizeof(s));
 35         len=1;
 36     }
 37     bign operator=(const char* num)
 38     {
 39         int i=0,ol;
 40         ol=len=strlen(num);
 41         while(num[i++]=='0'&&len>1)
 42             len--;
 43         memset(s,0,sizeof(s));
 44         for(i=0; i<len; i++)
 45             s[i]=num[ol-i-1]-'0';
 46         return *this;
 47     }
 48     bign operator=(int num)
 49     {
 50         char s[maxn];
 51         sprintf(s,"%d",num);
 52         *this=s;
 53         return *this;
 54     }
 55     bign(int num)
 56     {
 57         *this=num;
 58     }
 59     bign(const char* num)
 60     {
 61         *this=num;
 62     }
 63     string str() const
 64     {
 65         string res="";
 66         for(int i=0; i<len; i++)
 67             res=char(s[i]+'0')+res;
 68         if(res=="")
 69             res="0";
 70         return res;
 71     }
 72 };
 73 bool operator<(const bign& a,const bign& b)
 74 {
 75     int i;
 76     if(a.len!=b.len)
 77         return a.len<b.len;
 78     for(i=a.len-1; i>=0; i--)
 79         if(a.s[i]!=b.s[i])
 80             return a.s[i]<b.s[i];
 81     return false;
 82 }
 83 bool operator>(const bign& a,const bign& b)
 84 {
 85     return b<a;
 86 }
 87 bool operator<=(const bign& a,const bign& b)
 88 {
 89     return !(a>b);
 90 }
 91 bool operator>=(const bign& a,const bign& b)
 92 {
 93     return !(a<b);
 94 }
 95 bool operator!=(const bign& a,const bign& b)
 96 {
 97     return a<b||a>b;
 98 }
 99 bool operator==(const bign& a,const bign& b)
100 {
101     return !(a<b||a>b);
102 }
103 bign operator+(const bign& a,const bign& b)
104 {
105     int up=max(a.len,b.len);
106     bign sum;
107     sum.len=0;
108     for(int i=0,t=0;t||i<up; i++)
109     {
110         if(i<a.len)
111             t+=a.s[i];
112         if(i<b.len)
113             t+=b.s[i];
114         sum.s[sum.len++]=t%10;
115         t/=10;
116     }
117     return sum;
118 }
119 bign operator+(const bign& a,int& b)
120 {
121     bign c=b;
122     return a+c;
123 }
124 bign operator*(const bign& a,const bign& b)
125 {
126     bign res;
127     for(int i=0; i<a.len; i++)
128     {
129         for(int j=0; j<b.len; j++)
130         {
131             res.s[i+j]+=(a.s[i]*b.s[j]);
132             res.s[i+j+1]+=res.s[i+j]/10;
133             res.s[i+j]%=10;
134         }
135     }
136     res.len=a.len+b.len;
137     while(res.s[res.len-1]==0&&res.len>1)
138         res.len--;
139     if(res.s[res.len])
140         res.len++;
141     return res;
142 }
143 bign operator*(const bign& a,int& b)
144 {
145     bign c=b;
146     return a*c;
147 }
148 //只支持大数减小数
149 bign operator-(const bign& a,const bign& b)
150 {
151     bign res;
152     int len=a.len;
153     for(int i=0; i<len; i++)
154     {
155         res.s[i]+=a.s[i]-b.s[i];
156         if(res.s[i]<0)
157         {
158             res.s[i]+=10;
159             res.s[i+1]--;
160         }
161     }
162     while(res.s[len-1]==0&&len>1)
163         len--;
164     res.len=len;
165     return res;
166 }
167 bign operator-(const bign& a,int& b)
168 {
169     bign c=b;
170     return a-c;
171 }
172 bign operator/(const bign& a,const bign& b)
173 {
174     int i,len=a.len;
175     bign res,f;
176     for(i=len-1; i>=0; i--)
177     {
178         f=f*10;
179         f.s[0]=a.s[i];
180         while(f>=b)
181         {
182             f=f-b;
183             res.s[i]++;
184         }
185     }
186     while(res.s[len-1]==0&&len>1)
187         len--;
188     res.len=len;
189     return res;
190 }
191 bign operator/(const bign& a,int& b)
192 {
193     bign c=b;
194     return a/c;
195 }
196 bign operator%(const bign& a,const bign& b)
197 {
198     int len=a.len;
199     bign f;
200     for(int i=len-1; i>=0; i--)
201     {
202         f=f*10;
203         f.s[0]=a.s[i];
204         while(f>=b)
205             f=f-b;
206     }
207     return f;
208 }
209 bign operator%(const bign& a,int& b)
210 {
211     bign c=b;
212     return a%c;
213 }
214 bign& operator+=(bign& a,const bign& b)
215 {
216     a=a+b;
217     return a;
218 }
219 bign& operator-=(bign& a,const bign& b)
220 {
221     a=a-b;
222     return a;
223 }
224 bign& operator*=(bign& a,const bign& b)
225 {
226     a=a*b;
227     return a;
228 }
229 bign& operator/=(bign& a,const bign& b)
230 {
231     a=a/b;
232     return a;
233 }
234 bign& operator++(bign& a)
235 {
236     a=a+1;
237     return a;
238 }
239 bign& operator++(bign& a,int)
240 {
241     bign t=a;
242     a=a+1;
243     return t;
244 }
245 bign& operator--(bign& a)
246 {
247     a=a-1;
248     return a;
249 }
250 bign& operator--(bign& a,int)
251 {
252     bign t=a;
253     a=a-1;
254     return t;
255 }
256 istream& operator>>(istream &in,bign& x)
257 {
258     string s;
259     in>>s;
260     x=s.c_str();
261     return in;
262 }
263 ostream& operator<<(ostream &out,const bign& x)
264 {
265     out<<x.str();
266     return out;
267 }
268 int main()
269 {
270     bign a, b;
271     return 0;
272 }
View Code

 

posted @ 2018-06-17 18:26  Schenker  阅读(179)  评论(0)    收藏  举报