Bignum类的程序提交

日期:2018.7.19

星期四

博客期:002

  这之前赶着做一个单机游戏的修改器忘了时间,不好意思啊!今天我就把Bignum类的源代码发出来,文件的话,我不知道怎样发,待我好好研究研究这个网站哈!因为内容实在是太大了!我就不排版了啊!

//===================》如下为 main.cpp 文件

  1 #include<iostream>
  2 using namespace std;
  3 #include<Windows.h>
  4 #include"Basic.h"
  5 #include"Bignum.h"
  6 Bignum touch1,touch2;
  7 void win0()
  8 {
  9  system("cls");
 10  Basic::pend();
 11  Basic::make_an_char("Basic Class Practise",'*',1,2,2);
 12  Basic::pend();
 13  Basic::pend(' ');
 14  Basic::pend('=',28);
 15  Basic::pend();
 16  Basic::pend(' ');
 17 }
 18 void win1()
 19 {
 20  win0();
 21  Basic::pend();
 22  cout<<"     Please choice these:"<<endl<<endl;;
 23  cout<<"       S:设置第一个大数"<<endl<<endl;
 24  cout<<"       M:设置第二个大数"<<endl<<endl;
 25  cout<<"         D:选择运算"<<endl<<endl;
 26  cout<<"         I:查看说明"<<endl<<endl;
 27  cout<<"         Q:退出程序"<<endl<<endl;
 28  cout<<"              ";
 29 }
 30 //设置第一个大数
 31 void S()
 32 {
 33  char printin[100];
 34  system("cls");
 35  cout<<endl<<endl;
 36  Basic::make_an_char("set Bignum",'-',0,2,11);
 37  Basic::pend(2);
 38  cout<<" --------------------------------------"<<endl<<endl;
 39  cout<<"        请输入第一个大数的值:"<<endl<<endl<<"                  ";
 40  cin>>printin;
 41  touch1 = Bignum(printin);
 42  cout<<endl<<"           数据存储完成"<<endl;
 43  Basic::pend(2);
 44  cout<<"           ";
 45  system("PAUSE");
 46 }
 47 //设置第二个大数
 48 void M()
 49 {
 50  char printin[100];
 51  system("cls");
 52  cout<<endl<<endl;
 53  Basic::make_an_char("set Bignum",'-',0,2,11);
 54  Basic::pend(2);
 55  cout<<" --------------------------------------"<<endl<<endl;
 56  cout<<"        请输入第二个大数的值:"<<endl<<endl<<"                ";
 57  cin>>printin;
 58  touch2 = Bignum(printin);
 59  cout<<endl<<"               数据存储完成"<<endl;
 60  Basic::pend(2);
 61  cout<<"           ";
 62  system("PAUSE");
 63 }
 64 //选择运算
 65 void D()
 66 {
 67  system("cls");
 68  Basic::make_an_char("选择运算",'-',0,2,9);
 69  char x='0';
 70  Bignum touch3;
 71  cout<<" --------------------------------"<<endl;
 72  cout<<"          请输入运算符:"<<endl;
 73  while(x!='+'&&x!='-'&&x!='*'&&x!='/'&&x!='%')
 74  {
 75   cout<<"                ";
 76   cin>>x;
 77  }
 78  cout<<endl<<" ********************************"<<endl<<endl;
 79  cout<<" "<<touch1<<endl;
 80  cout<<" "<<x<<endl;
 81  cout<<" "<<touch2<<endl;
 82  cout<<" ="<<endl;
 83  switch(x)
 84  {
 85  case '+':touch3=touch1+touch2;break;
 86  case '-':touch3=touch1-touch2;break;
 87  case '*':Bignum::multiplication(touch1,touch2);break;
 88  case '/':touch3=touch1/touch2;break;
 89  case '%':touch3=touch1%touch2;break;
 90  default:break;
 91  }
 92  cout<<" "<<touch3<<endl<<endl<<" ********************************"<<endl;
 93  cout<<endl;
 94  system("PAUSE");
 95 }
 96 //查看说明
 97 void I()
 98 {
 99  system("cls");
100  Basic::pend(2);
101  Basic::make_an_char("Instruction",'*',1,2,2);
102  cout<<endl<<endl;
103  cout<<"  Maker:    Master"<<endl<<endl;
104  cout<<"  Name:     Bignum's Program"<<endl<<endl;
105  cout<<"  Date:     2018.7.19"<<endl<<endl;
106  cout<<"  Version:  1.023"<<endl<<endl;
107  cout<<"  ";
108  system("PAUSE");
109 }
110 //退出程序
111 void Q()
112 {
113  system("cls");
114  Basic::pend(2);
115  Basic::make_an_char("Welcome to the next time !",'*',1,2,2);
116  cout<<endl<<endl<<"        ";
117 }
118 int main()
119 {
120  Bignum tar[20];
121  char x='c';
122  while(x!='q'&&x!='Q')
123  {
124   win1();
125   cin>>x;
126   getchar();
127   switch(x)
128   {
129   case 's':
130   case 'S':S();break;
131   case 'm':
132   case 'M':M();break;
133   case 'd':
134   case 'D':D();break;
135   case 'i':
136   case 'I':I();break;
137   case 'q':
138   case 'Q':Q();break;
139   default:break;
140   }
141  }
142  return 0;
143 }
main.cpp

//=============================》如下为 Basic.h 文件

  1 #include<iostream>
  2 using namespace std;
  3 #include<string>
  4 class Basic
  5 {
  6 public:
  7  //====================<输入输出>=======================//
  8  /*
  9  /-----------<pend函数>
 10  /-# 
 11  /----(1)默认输出"
",可直接输入int类型变量或常量给形参n,得到输出n次的换行(默认输出一次)
 12  /----(2)可指定字符p,输入n次(默认输出一次)
 13  /----(3)可连续输出对间隔输出
 14  */ 
 15  static void pend(const int n=1)
 16  {
 17   for(int i=0;i<n;i++)
 18    cout<<endl;
 19  }
 20  static void pend(const char p,const int n=1)
 21  {
 22   for(int i=0;i<n;i++)
 23    cout<<p;
 24  }
 25  static void pend(const char p,const char q,const int n=1,const int m=1,const bool s=true)
 26  {
 27   if(s)
 28   {
 29    Basic::pend(p,n);
 30    Basic::pend(q,m);
 31   }
 32   else
 33   {
 34    if(m==n)
 35     for(int i=0;i<n;i++)
 36     {
 37      Basic::pend(p);
 38      Basic::pend(q);
 39     }
 40   }
 41  }
 42  static void pend(const char o,const char p,const char q,const int l=1,const int m=1,const int n=1)
 43  {
 44   Basic::pend(o,l);
 45   Basic::pend(p,m);
 46   Basic::pend(q,n);
 47  }
 48  /*
 49  /-----------<printarray函数>
 50  /-# 
 51  /----(1)用于打印一维数组或二维数组
 52  /----(2)可确定初始位置(begin)
 53  /----(3)可设定列间距(lie) 
 54  /----(4)使用时必须设定数组长度 
 55  /----(5)数据中从du开始读,并结束于 n(即 n可以小于 p的实际长度)
 56  /----(6)数据的列从da开始读,并结束于 m(同上)
 57  */ 
 58  template <typename T>
 59  static void printarray(T *p,int n=0,const int lie=1,const int begin=1,int du=0)
 60  {
 61   if(n==0)
 62    return;
 63   Basic::pend(' ',begin);
 64   for(int i=du;i<n;i++)
 65   {
 66    cout<<p[i];
 67    if(i!=n-1)
 68     Basic::pend(' ',lie);
 69   }
 70   Basic::pend();
 71  }
 72  template <typename T>
 73  static void printarray(T **q,int n=0,int m=0,const int hang=0,const int lie=1,const int begin=1,int du=0,int da=0)
 74  {
 75   if(n==0||m==0)
 76    return;
 77   for(int t=da;t<m;t++)
 78   {
 79    Basic::pend(' ',begin);
 80    for(int i=du;i<n;i++)
 81    {
 82     cout<<q[t][i];
 83     if(i!=n-1)
 84      Basic::pend(' ',lie);
 85    }
 86    Basic::pend(hang+1);
 87   }
 88  }
 89  //====================<窗口>=======================//
 90  /*
 91  /-----------<make_an_char函数>
 92  /-# 
 93  /----(1)窗口制定 
 94  /----(2)可设定长宽
 95  /----(3)可确定初始位置  
 96  */ 
 97  static void make_an_char(char *q,const char p='*',const int hang=0,const int lie=1,const int begin=1)
 98  {
 99   //最初行 
100   Basic::pend(' ',begin);
101   Basic::pend(p,lie+1);
102   for(int i=0;*(q+i)!='';i++)
103    Basic::pend(p);
104   Basic::pend(p,lie+1);
105   //最初行 
106   //-------------------------
107   //hang的行 
108   Basic::pend();
109   Basic::pend(' ',begin);
110   for(int j=0;j<hang;j++)
111   {
112    Basic::pend(p);
113    Basic::pend(' ',2*lie);
114    for(int i=0;*(q+i)!='';i++)
115     Basic::pend(' ');
116    Basic::pend(p);
117    Basic::pend();
118    Basic::pend(' ',begin);
119   } 
120   //hang的行
121   //----------------------
122   //内容行 
123   Basic::pend(p);
124   Basic::pend(' ',lie);
125   printf("%s",q);
126   Basic::pend(' ',lie);
127   Basic::pend(p);
128   //内容行 
129   //------------------------
130   //hang的行 
131   Basic::pend();
132   Basic::pend(' ',begin);
133   for(int j=0;j<hang;j++)
134   {
135    Basic::pend(p);
136    Basic::pend(' ',2*lie);
137    for(int i=0;*(q+i)!='';i++)
138     Basic::pend(' ');
139    Basic::pend(p);
140    Basic::pend();
141    Basic::pend(' ',begin);
142   } 
143   //hang的行
144   //---------------------
145   //最末行
146   Basic::pend(p,lie+1);
147   for(int i=0;*(q+i)!='';i++)
148    Basic::pend(p);
149   Basic::pend(p,lie+1);
150   //最末行
151   Basic::pend();
152  } 
153 };
Basic.h

//=============================》如下为 Bignum.h 文件

  1 #pragma once
  2 #include<iostream>
  3 #include<string>
  4 using namespace std;
  5 //----<<大数类>>----//
  6 class Bignum
  7 {
  8 protected:
  9  //--------------<内部数据存储>--------------//
 10  //---
 11  //数据存储
 12  char num[100];
 13  //正负存储
 14  bool ifhavef; 
 15 public:
 16  //--------------<附加小函数>--------------//
 17  //---
 18  //数据类型转换[直接使用]
 19  //===int和char表示变换
 20  friend int change(char x);
 21  friend char change(int x);
 22  //===int和char*的转换
 23  friend int change_s(char x[100]); 
 24  friend void change_s(int x,char y[100]);
 25  //===int和Bignum的类型转换
 26  friend int change_ib(Bignum &x);
 27  friend Bignum change_ib(int x);
 28  //===char转为char[100]
 29  friend void change(char x,char y[100]);
 30  //===char和Bignum的类型转换
 31  friend char change_cb(Bignum &x);
 32  friend Bignum change_cb(char x);
 33  //===char*和Bignum的类型转换
 34  friend void change_cbs(Bignum &x,char y[100]);
 35  friend Bignum change_cbs(char x[100]);
 36  //---
 37  //---
 38  //排除-0的情况(将-0转为+0) 
 39  void test();
 40  //排除内部 num 有‘ - ’字符 
 41  void test_s();
 42  //读取第first个到第last个成员组成新的字符串 [直接使用] 
 43  friend void strf(char n[100],char ios[100],int first,int last);
 44  //---
 45  //--------------<静态小函数>--------------//
 46  //---
 47  //位数函数 
 48  //===[长度前移更新 ]
 49  void static runformer(char x[100]);
 50  //===[字符串位数升高 [后面补 0 ](默认升高 1 位) ]
 51  void static run0(char x[100]);
 52  void static run0(char x[100],int ct);
 53  //===[长度后移 x位(默认后移 1 位)] 
 54  void static runlatter(char x[100]);
 55  void static runlatter(char x[100],int t);
 56  //---
 57  //--- 
 58  //相反数
 59  Bignum static anti(Bignum &x);
 60  //交换函数
 61  void static exchange(Bignum &x,Bignum &y);
 62  //返回 10 的 i 次幂 
 63  Bignum static run1(const int i);
 64  //---
 65  //--- 
 66  //长度函数 
 67  //===[测量整形、大数或字符串的长度]
 68  int static litude(int x);
 69  int static litude(char x[100]);
 70  int static litude(Bignum &z);
 71  //===[判断是否 x和 y相同长度 ]
 72  bool static ifsamelong(Bignum &x,Bignum &y);
 73  //---
 74  //--------------<output、intput函数>--------------//
 75  //--- 
 76  //set函数
 77  //===[设置ifhavef]
 78  void setf(const bool ifhavef_s);
 79  //===[设置num]
 80  void setnum(const char num_s[100]);
 81  void setnum(const char x);
 82  //===[设置num和ifhavef] 
 83  void set(const char num_s[100],const bool ifhavef_s);
 84  void set(const bool ifhavef_s,const char num_s[100]);
 85  //---
 86  //--- 
 87  //input函数
 88  void input();
 89  void static input(Bignum &x);
 90  //output函数
 91  void output();
 92  void static output(Bignum &x); 
 93  //---
 94  //--------------<运算函数>--------------//
 95  //--- 
 96  //加法
 97  //===[int置前]
 98  Bignum static addition(int x,int y);
 99  Bignum static addition(int x,char y);
100  Bignum static addition(int x,char y[100]);
101  Bignum static addition(int x,Bignum &y);
102  //===[char置前]
103  Bignum static addition(char x,int y);  
104  Bignum static addition(char x,char y);
105  Bignum static addition(char x,char y[100]);
106  Bignum static addition(char x,Bignum &y);
107  //===[char*置前]
108  Bignum static addition(char x[100],int y); 
109  Bignum static addition(char x[100],char y);
110  Bignum static addition(char x[100],char y[100]); 
111  Bignum static addition(char x[100],Bignum &y); 
112  //===[Bignum置前]
113  Bignum static addition(Bignum &x,int y); 
114  Bignum static addition(Bignum &x,char y); 
115  Bignum static addition(Bignum &x,char y[100]); 
116  Bignum static addition(Bignum &x,Bignum &y);
117  //---
118  //---                
119  //减法
120  //===[int置前]
121  Bignum static subtraction(int x,int y);
122  Bignum static subtraction(int x,char y);
123  Bignum static subtraction(int x,char y[100]);
124  Bignum static subtraction(int x,Bignum &y);
125  //===[char置前]
126  Bignum static subtraction(char x,int y);  
127  Bignum static subtraction(char x,char y);
128  Bignum static subtraction(char x,char y[100]);
129  Bignum static subtraction(char x,Bignum &y);
130  //===[char*置前]
131  Bignum static subtraction(char x[100],int y);
132  Bignum static subtraction(char x[100],char y);
133  Bignum static subtraction(char x[100],char y[100]);
134  Bignum static subtraction(char x[100],Bignum &y); 
135  //===[Bignum置前]
136  Bignum static subtraction(Bignum &x,int y); 
137  Bignum static subtraction(Bignum &x,char y); 
138  Bignum static subtraction(Bignum &x,char y[100]);
139  Bignum static subtraction(Bignum &x,Bignum &y);
140  //---
141  //---
142  //乘法
143  //===[int置前]
144  Bignum static multiplication(int x,int y);//未写
145  Bignum static multiplication(int x,char y);//未写
146  Bignum static multiplication(int x,char y[100]);//未写
147  Bignum static multiplication(int x,Bignum &y);
148  //===[char置前]
149  Bignum static multiplication(char x,int y);//未写 
150  Bignum static multiplication(char x,char y);//未写
151  Bignum static multiplication(char x,char y[100]);//未写 
152  Bignum static multiplication(char x,Bignum &y);
153  //===[char*置前]
154  Bignum static multiplication(char x[100],int y);//未写
155  Bignum static multiplication(char x[100],char y);//未写
156  Bignum static multiplication(char x[100],char y[100]);//未写
157  Bignum static multiplication(char x[100],Bignum y);//未写
158  //===[Bignum置前]
159  Bignum static multiplication(Bignum &x,int y);
160  Bignum static multiplication(Bignum &x,char y);
161  Bignum static multiplication(Bignum &x,char y[100]);
162  Bignum static multiplication(Bignum &x,Bignum &y); 
163  //---
164  //--- 
165  //除法
166  //===[char*置前]
167  Bignum static division(char x[100],int y);
168  Bignum static division(char x[100],char y);
169  Bignum static division(char x[100],char y[100]);
170  Bignum static division(char x[100],Bignum &y);
171  //===[Bignum置前]
172  Bignum static division(Bignum &x,int y);
173  Bignum static division(Bignum &x,char y);
174  Bignum static division(Bignum &x,char y[100]);
175  Bignum static division(Bignum &x,Bignum &y);
176  //---
177  //--- 
178  //求余数
179  //===[char*置前]
180  Bignum static rest(char x[100],int y);
181  Bignum static rest(char x[100],char y);
182  Bignum static rest(char x[100],char y[100]);
183  Bignum static rest(char x[100],Bignum &y);
184  //===[Bignum置前]
185  Bignum static rest(Bignum &x,Bignum &y);
186  Bignum static rest(Bignum &x,int y);
187  Bignum static rest(Bignum &x,char y);
188  Bignum static rest(Bignum &x,char y[100]);
189  //---
190  //---
191  //求幂数 
192  //===[int置前]
193  Bignum static pxp(int x,int y);
194  Bignum static pxp(int x,char y);
195  Bignum static pxp(int x,char y[100]);
196  Bignum static pxp(int x,Bignum &y);
197  //===[char置前]
198  Bignum static pxp(char x,int y);
199  Bignum static pxp(char x,char y);
200  Bignum static pxp(char x,char y[100]);
201  Bignum static pxp(char x,Bignum &y);
202  //===[char[100]置前]
203  Bignum static pxp(char x[100],int y);
204  Bignum static pxp(char x[100],char y);
205  Bignum static pxp(char x[100],char y[100]);
206  Bignum static pxp(char x[100],Bignum &y);
207  //===[Bignum置前]
208  Bignum static pxp(Bignum &x,int y); 
209  Bignum static pxp(Bignum &x,char y); 
210  Bignum static pxp(Bignum &x,char y[100]);
211  Bignum static pxp(Bignum &x,Bignum &y);
212  //---
213  //--------------<运算符重载>--------------//
214  //--- 
215  //加法
216  //===[Bignum置前]
217  friend Bignum operator +(Bignum &x,int y);
218  friend Bignum operator +(Bignum &x,char y); 
219  friend Bignum operator +(Bignum &x,char y[100]); 
220  friend Bignum operator +(Bignum &x,Bignum &y);
221  //===[Bignum置后]
222  friend Bignum operator +(int x,Bignum &y); 
223  friend Bignum operator +(char x,Bignum &y); 
224  friend Bignum operator +(char x[100],Bignum &y);
225  //---
226  //---
227  //减法
228  //===[Bignum置前]
229  friend Bignum operator -(Bignum &x,int y); 
230  friend Bignum operator -(Bignum &x,char y);
231  friend Bignum operator -(Bignum &x,char y[100]);
232  friend Bignum operator -(Bignum &x,Bignum &y);
233  //===[Bignum置后]
234  friend Bignum operator -(int x,Bignum &y); 
235  friend Bignum operator -(char x,Bignum &y);
236  friend Bignum operator -(char x[100],Bignum &y);
237  //---
238  //---
239  //除法
240  //===[Bignum置前]
241  friend Bignum operator /(Bignum &x,int y);
242  friend Bignum operator /(Bignum &x,char y);
243  friend Bignum operator /(Bignum &x,char y[100]);
244  friend Bignum operator /(Bignum &x,Bignum &y);
245  //===[Bignum置后]
246  friend Bignum operator /(char x[100],Bignum &y);
247  //---
248  //---
249  //求余数
250  //===[Bignum置前] 
251  friend Bignum operator %(Bignum &x,int y); 
252  friend Bignum operator %(Bignum &x,char y);
253  friend Bignum operator %(Bignum &x,char y[100]); 
254  friend Bignum operator %(Bignum &x,Bignum &y);
255  //===[Bignum置后] 
256  friend Bignum operator %(char x[100],Bignum &y); 
257  //---
258  //---
259  //单目运算符
260  //===[++运算]
261  //---
262  //======[前置++](绝对值) 
263  Bignum operator ++(); 
264  //--- 
265  //======[后置++](数值运算) 
266  Bignum operator ++(int x);
267  //===[--运算]
268  //---
269  //======[前置--](相反数)
270  Bignum operator --();
271  //--- 
272  //======[后置--](数值运算)
273  Bignum operator --(int x);
274  //---
275  //---
276  //比较函数
277  //===[小于]
278  //---
279  //======[Bignum置前] 
280  friend bool operator <(Bignum &x,int y); 
281  friend bool operator <(Bignum &x,char y);
282  friend bool operator <(Bignum &x,char y[100]); 
283  friend bool operator <(Bignum &x,Bignum &y);
284  //======[Bignum置后]
285  friend bool operator <(int x,Bignum &y); 
286  friend bool operator <(char x,Bignum &y); 
287  friend bool operator <(char x[100],Bignum &y); 
288  //---
289  //===[大于] 
290  //---
291  //======[Bignum置前] 
292  friend bool operator >(Bignum &x,int y);
293  friend bool operator >(Bignum &x,char y); 
294  friend bool operator >(Bignum &x,char y[100]); 
295  friend bool operator >(Bignum &x,Bignum &y);
296  //======[Bignum置后]
297  friend bool operator >(int x,Bignum &y); 
298  friend bool operator >(char x,Bignum &y); 
299  friend bool operator >(char x[100],Bignum &y);
300  //---
301  //===[等于]
302  //---
303  //======[Bignum置前] 
304  friend bool operator ==(Bignum &x,int y); 
305  friend bool operator ==(Bignum &x,char y); 
306  friend bool operator ==(Bignum &x,char y[100]);
307  friend bool operator ==(Bignum &x,Bignum &y);
308  //======[Bignum置后]
309  friend bool operator ==(int x,Bignum &y);
310  friend bool operator ==(char x,Bignum &y); 
311  friend bool operator ==(char x[100],Bignum &y);
312  //---
313  //===[不等于] 
314  //---
315  //======[Bignum置前] 
316  friend bool operator !=(Bignum &x,int y);
317  friend bool operator !=(Bignum &x,char y); 
318  friend bool operator !=(Bignum &x,char y[100]); 
319  friend bool operator !=(Bignum &x,Bignum &y);
320  //======[Bignum置后]
321  friend bool operator !=(int x,Bignum &y); 
322  friend bool operator !=(char x,Bignum &y);
323  friend bool operator !=(char x[100],Bignum &y);
324  //---
325  //===[小于或等于] 
326  //---
327  //======[Bignum置前] 
328  friend bool operator <=(Bignum &x,int y); 
329  friend bool operator <=(Bignum &x,char y); 
330  friend bool operator <=(Bignum &x,char y[100]);
331  friend bool operator <=(Bignum &x,Bignum &y);
332  //======[Bignum置后]
333  friend bool operator <=(int x,Bignum &y); 
334  friend bool operator <=(char x,Bignum &y);
335  friend bool operator <=(char x[100],Bignum &y);
336  //---
337  //===[大于或等于]
338  //---
339  //======[Bignum置前] 
340  friend bool operator >=(Bignum &x,int y); 
341  friend bool operator >=(Bignum &x,char y); 
342  friend bool operator >=(Bignum &x,char y[100]); 
343  friend bool operator >=(Bignum &x,Bignum &y);
344  //======[Bignum置后]
345  friend bool operator >=(int x,Bignum &y); 
346  friend bool operator >=(char x,Bignum &y); 
347  friend bool operator >=(char x[100],Bignum &y);
348  //---
349  //---
350  //输入输出流 
351  //===[输入]
352  friend istream & operator >>(istream &in,Bignum &x);
353  //===[输出]
354  friend ostream & operator <<(ostream &out,Bignum &x);
355  //---
356  //--------------<构造和析构函数>--------------//
357  //--- 
358  //构造函数
359  //===无参构造函数 
360  Bignum();
361  //===转换构造函数 
362  Bignum(int num);
363  Bignum(char p);
364  Bignum(char p[100]);
365  //===拷贝构造函数 
366  Bignum(Bignum &x);
367  //---
368  //--- 
369  //析构函数 
370  ~Bignum();
371 };
Bignum.h

//========================================》如下为 Bignum.cpp 文件

   1 #include "Bignum.h"
   2 //--------------<附加小函数>--------------//
   3 //---
   4 //数据类型转换[直接使用]
   5 //===int和char表示变换
   6 int change(char x)
   7 {
   8  return (int)(x-'0');
   9 }
  10 char change(int x)
  11 {
  12  return (char)(x+'0');
  13 }
  14 //===int和char*的转换
  15 int change_s(char x[100])
  16 {
  17  int z=0,k=1;
  18  bool havef=x[0]=='-';
  19  char y[100];
  20  strcpy(y,x);
  21  if(havef)
  22  {
  23   y[0]='0';
  24   Bignum::runformer(y);
  25  }
  26  int l=Bignum::litude(y);
  27  for(int i=l-1;i>=0;i--)
  28  {
  29   z=z+k*change(y[i]);
  30   k=k*10;
  31  }
  32  if(havef)
  33   z=-z;
  34  return z;
  35 }
  36 void change_s(int x,char y[100])
  37 {
  38  bool havef=x<0;
  39  if(havef)
  40   x=-x;
  41  char p[100]="0";
  42  int l=Bignum::litude(x);
  43  int u=1;
  44  for(int i=1;i<l;i++)
  45   u=u*10;
  46  for(int i=0;i<l;i++)
  47  {
  48   p[i]=change((x/u)%10);
  49   u=u/10;
  50  }
  51  p[l]='';
  52  Bignum::runformer(p);
  53  if(havef)
  54  {
  55   Bignum::runlatter(p);
  56   p[0]='-';
  57  }
  58  strcpy(y,p);
  59 } 
  60 //===int和Bignum的类型转换
  61 int change_ib(Bignum &x)
  62 {
  63  return x.ifhavef?-change_s(x.num):change_s(x.num);
  64 }
  65 Bignum change_ib(int x)
  66 {
  67  Bignum z;
  68  bool havef=x<0;
  69  if(havef)
  70   x=-x;
  71  char p[100];
  72  change_s(x,p);
  73  z.set(p,havef);
  74  return z;
  75 }
  76 //===char*转为char[100]
  77 void change(char x,char y[100])
  78 {
  79  y[0]=x;
  80  y[1]='';
  81 }
  82 //===char和Bignum的类型转换
  83 char change_cb(Bignum &x)
  84 {
  85  x.test();
  86  return x.num[0];
  87 }
  88 Bignum change_cb(char x)
  89 {
  90  Bignum y(x);
  91  return y;
  92 }
  93 //===char*和Bignum的类型转换
  94 void change_cbs(Bignum &x,char y[100])
  95 {
  96  Bignum::runformer(x.num);
  97  x.test();
  98  strcpy(y,x.num);
  99  if(x.ifhavef)
 100  {
 101   Bignum::runlatter(y);
 102   y[0]='-';
 103  }
 104 }
 105 Bignum change_cbs(char x[100])
 106 {
 107  Bignum z(x);
 108  return z;
 109 }
 110 //---
 111 //---
 112 //排除-0的情况(将-0转为+0) 
 113 void Bignum::test()
 114 {
 115  if(ifhavef&&strcmp(num,"0")==0)
 116   ifhavef=false;
 117 }
 118 //排除内部 num 有‘ - ’字符 
 119 void Bignum::test_s()
 120 {
 121  if(num[0]=='-')
 122  {
 123   num[0]='0';
 124   Bignum::runformer(num);
 125   ifhavef=!ifhavef;
 126  }
 127 }
 128 //读取第first个到第last个成员组成新的字符串 [直接使用] 
 129 void strf(char pr[100],char save[100],int first,int last)
 130 {
 131  int i,j;
 132  for(i=0,j=first-1;j!=last&&pr[j]!='';j++,i++)
 133   save[i]=pr[j];
 134  save[i]='';
 135 }
 136 //---
 137 //--------------<静态小函数>--------------//
 138 //---
 139 //位数函数 
 140 //===[长度前移更新 ]
 141 void Bignum::runformer(char x[100])
 142 {
 143  int m=0;//执行前移的次数 
 144  for(int i=0;i<100;i++)//测定m的值 
 145  {
 146   if(x[i]!='0')
 147    break;
 148   m++;
 149  }
 150  if(m==0)
 151   return ;
 152  for(int i=0;x[i+m-1]!='';i++)//前移 
 153   x[i]=x[i+m];
 154  if(x[0]=='')
 155  {
 156   x[1]=x[0];
 157   x[0]='0';
 158  }
 159 } 
 160 //===[字符串位数升高 [后面补 0 ](默认升高 1 位) ]
 161 void Bignum::run0(char x[100])
 162 {
 163  int zz=Bignum::litude(x);
 164  x[zz]='0';
 165  x[zz+1]='';
 166 }
 167 void Bignum::run0(char x[100],int ct)
 168 {
 169  for(int i=1;i<=ct;i++)
 170   Bignum::run0(x);
 171 }
 172 //===[长度后移 x位(默认后移 1 位)] 
 173 void Bignum::runlatter(char x[100])
 174 {
 175  char s[100];
 176  int i;
 177  for(i=0;i<100&&x[i]!='';i++)
 178   s[i+1]=x[i];
 179  s[i+1]='';
 180  s[0]='0';
 181  strcpy(x,s);
 182 }
 183 void Bignum::runlatter(char x[100],int t)
 184 {
 185  char s[100];
 186  s[1]=x[0];
 187  int i;
 188  for(i=0;i<100&&x[i]!='';i++)//后移一次 
 189  {
 190   s[i+1]=x[i];
 191  }
 192  s[i+1]='';
 193  s[0]='0';
 194  strcpy(x,s);
 195  if(t!=1)//递归 
 196   Bignum::runlatter(x,t-1);
 197 }
 198 //---
 199 //--- 
 200 //相反数
 201 Bignum Bignum::anti(Bignum &x)
 202 {
 203  Bignum z(x.num);
 204  z.setf(!x.ifhavef);
 205  z.test();
 206  return z;
 207 }
 208 //交换函数
 209 void Bignum::exchange(Bignum &x,Bignum &y)
 210 {
 211  Bignum z(x);
 212  x.set(y.num,y.ifhavef);
 213  y.set(z.num,z.ifhavef);
 214  x.test();
 215  y.test();
 216 }
 217 //返回 10 的 i 次幂 
 218 Bignum Bignum::run1(int i)
 219 {
 220  Bignum z;
 221  z.set("1",false);
 222  Bignum::run0(z.num,i);
 223  z.test();//无用
 224  return z;
 225 }
 226 //---
 227 //--- 
 228 //长度函数 
 229 //===[测量整形、大数或字符串的长度]
 230 //------准确的长度(不含'') 
 231 //------int最大长度为10
 232 int Bignum::litude(int x)
 233 {
 234  int num=10;
 235  int z=1000000000;
 236  if(x==0)
 237   return 1;
 238  while(num-1)
 239  {
 240   if((x/z)!=0)
 241    break;
 242   num--;
 243   z=z/10;
 244  }
 245  return num;
 246 }
 247 int Bignum::litude(char x[100])
 248 {
 249  int m;
 250  Bignum::runformer(x);
 251  for(int i=0;i<100;i++)
 252   if(x[i]=='')
 253   {
 254    m=i;
 255    break;
 256   }
 257  return m;
 258 }
 259 int Bignum::litude(Bignum &x)
 260 {
 261  return Bignum::litude(x.num);
 262 }
 263 //===[判断是否 x和 y相同长度 ]
 264 bool Bignum::ifsamelong(Bignum &x,Bignum &y)
 265 {
 266  return(Bignum::litude(x)==Bignum::litude(y));
 267 }
 268 //---
 269 //--------------<output、intput函数>--------------//
 270 //--- 
 271 //set函数
 272 //===[设置ifhavef]
 273 void Bignum::setf(const bool ifhavef_s)
 274 {
 275  ifhavef=ifhavef_s;
 276 }
 277 //===[设置num]
 278 void Bignum::setnum(const char x)
 279 {
 280  char arrays[100];
 281  arrays[1]='';
 282  arrays[0]=x;
 283  setnum(arrays);
 284 }
 285 void Bignum::setnum(const char num_s[100])
 286 {
 287  strcpy(num,num_s);
 288 }
 289 //===[设置num和ifhavef] 
 290 void Bignum::set(const char num_s[100],const bool ifhavef_s)
 291 {
 292  setf(ifhavef_s);
 293  setnum(num_s);
 294  test();
 295 }
 296 void Bignum::set(const bool ifhavef_s,const char num_s[100])
 297 {
 298  set(num_s,ifhavef_s);
 299 }
 300 //---
 301 //--- 
 302 //input函数 
 303 void Bignum::input()
 304 {
 305  char x[100];
 306  cin>>x;
 307  if(x[0]=='-')
 308  {
 309   x[0]='0';
 310   Bignum::runformer(x);
 311  }
 312  strcpy(num,x);
 313 } 
 314 void Bignum::input(Bignum &x)
 315 {
 316  x.input();
 317 }
 318 //output函数
 319 void Bignum::output()
 320 {
 321  cout<<*this;
 322 }
 323 void Bignum::output(Bignum &x)
 324 {
 325  x.output();
 326 }
 327 //---
 328 //--------------<运算函数>--------------//
 329 //--- 
 330 //加法
 331 //===[int置前] 
 332 Bignum Bignum::addition(int x,int y)
 333 {
 334  return change_ib(x+y);
 335 }
 336 Bignum Bignum::addition(int x,char y)
 337 {
 338  return change_ib(x+change(y));
 339 }
 340 Bignum Bignum::addition(int x,char y[100])
 341 {
 342  Bignum z1(y);
 343  Bignum z2(x);
 344  return z1+z2;
 345 }
 346 Bignum Bignum::addition(int x,Bignum &y)
 347 {
 348  return x+y;
 349 }
 350 //===[char置前]
 351 Bignum Bignum::addition(char x,int y)
 352 {
 353  return Bignum::addition(y,x);
 354 }
 355 Bignum Bignum::addition(char x,char y)
 356 {
 357  Bignum z(change(x)+change(y));
 358  return z;
 359 }
 360 Bignum Bignum::addition(char x,char y[100])
 361 {
 362  Bignum z(y);
 363  return z+x;
 364 }
 365 Bignum Bignum::addition(char x,Bignum &y)
 366 {
 367  Bignum z(x);
 368  return x+y;
 369 }
 370 //===[char*置前]
 371 Bignum Bignum::addition(char x[100],int y)
 372 {
 373  return Bignum::addition(y,x);
 374 }
 375 Bignum Bignum::addition(char x[100],char y)
 376 {
 377  return Bignum::addition(y,x);
 378 }
 379 Bignum Bignum::addition(char x[100],char y[100])
 380 {
 381  Bignum t(x);
 382  return t+y;
 383 }
 384 Bignum Bignum::addition(char x[100],Bignum &y)
 385 {
 386  return x+y;
 387 }
 388 //===[Bignum置前]
 389 Bignum Bignum::addition(Bignum &x,int y)
 390 {
 391  return Bignum::addition(y,x);
 392 }
 393 Bignum Bignum::addition(Bignum &x,char y)
 394 {
 395  return Bignum::addition(y,x);
 396 }
 397 Bignum Bignum::addition(Bignum &x,char y[100])
 398 {
 399  return Bignum::addition(y,x);
 400 }
 401 Bignum Bignum::addition(Bignum &x,Bignum &y)
 402 {
 403  Bignum z=x+y;
 404  return z;
 405 }
 406 //---
 407 //---                
 408 //减法
 409 //===[int置前]
 410 Bignum Bignum::subtraction(int x,int y)
 411 {
 412  Bignum z(x-y);
 413  return z;
 414 } 
 415 Bignum Bignum::subtraction(int x,char y)
 416 {
 417  Bignum t1(x),t2(y);
 418  return t1-t2;
 419 } 
 420 Bignum Bignum::subtraction(int x,char y[100])
 421 {
 422  Bignum t1(x),t2(y);
 423  return t1-t2;
 424 } 
 425 Bignum Bignum::subtraction(int x,Bignum &y)
 426 {
 427  return x-y;
 428 } 
 429 //===[char置前]
 430 Bignum Bignum::subtraction(char x,int y)
 431 {
 432  Bignum t1(x),t2(y);
 433  return t1-t2;
 434 } 
 435 Bignum Bignum::subtraction(char x,char y)
 436 {
 437  Bignum t1(x),t2(y);
 438  return t1-t2;
 439 } 
 440 Bignum Bignum::subtraction(char x,char y[100])
 441 {
 442  Bignum t1(x),t2(y);
 443  return t1-t2;
 444 } 
 445 Bignum Bignum::subtraction(char x,Bignum &y)
 446 {
 447  return x-y;
 448 } 
 449 //===[char*置前]
 450 Bignum Bignum::subtraction(char x[100],int y)
 451 {
 452  Bignum t1(x),t2(y);
 453  return t1-t2;
 454 } 
 455 Bignum Bignum::subtraction(char x[100],char y)
 456 {
 457  Bignum t1(x),t2(y);
 458  return t1-t2;
 459 } 
 460 Bignum Bignum::subtraction(char x[100],char y[100])
 461 {
 462  Bignum t1(x),t2(y);
 463  return t1-t2;
 464 } 
 465 Bignum Bignum::subtraction(char x[100],Bignum &y)
 466 {
 467  return x-y;
 468 } 
 469 //===[Bignum置前]
 470 Bignum Bignum::subtraction(Bignum &x,int y)
 471 {
 472  return x-y;
 473 }
 474 Bignum Bignum::subtraction(Bignum &x,char y)
 475 {
 476  return x-y;
 477 }
 478 Bignum Bignum::subtraction(Bignum &x,char y[100])
 479 {
 480  return x-y;
 481 }
 482 Bignum Bignum::subtraction(Bignum &x,Bignum &y)
 483 {
 484  return x-y;
 485 }
 486 //---
 487 //---
 488 //乘法
 489 //===[int置前]
 490 Bignum Bignum::multiplication(int x,int y)
 491 {
 492  return change_ib(x*y); 
 493 }
 494 Bignum Bignum::multiplication(int x,char y)
 495 {
 496  return change_ib(x*change(y));
 497 }
 498 Bignum Bignum::multiplication(int x,char y[100])
 499 {
 500  return Bignum::subtraction(x,change_cbs(y));
 501 }
 502 Bignum Bignum::multiplication(int x,Bignum &y)
 503 {
 504  Bignum z;
 505  z=Bignum::multiplication(y,x);
 506  return z;
 507 }
 508 //===[char置前]
 509 Bignum Bignum::multiplication(char x,int y)
 510 { 
 511  return Bignum::multiplication(y,x);
 512 }
 513 Bignum Bignum::multiplication(char x,char y)
 514 {
 515   return change_ib(change(x)*change(y));
 516 }
 517 Bignum Bignum::multiplication(char x,char y[100])
 518 { 
 519  return Bignum::multiplication(x,change_cbs(y));
 520 }
 521 Bignum Bignum::multiplication(char x,Bignum &y)
 522 {
 523  Bignum z;
 524  z=Bignum::multiplication(y,change(x));
 525  return z;
 526 }
 527 //===[char*置前]
 528 Bignum Bignum::multiplication(char x[100],int y)
 529 { 
 530  return Bignum::multiplication(y,x);
 531 }
 532 Bignum Bignum::multiplication(char x[100],char y)
 533 { 
 534  return Bignum::multiplication(y,x);
 535 }
 536 Bignum Bignum::multiplication(char x[100],char y[100])
 537 { 
 538  Bignum t1(x),t2(y);
 539  return Bignum::multiplication(t1,t2);
 540 }
 541 //===[Bignum置前]
 542 Bignum Bignum::multiplication(Bignum &x,int y)
 543 {
 544  Bignum t(x);
 545  if(y>=0&&y<=9)
 546  {
 547   char arrays[100];
 548   Bignum::runlatter(t.num);
 549   arrays[Bignum::litude(t)]='';
 550   for(int i=Bignum::litude(t)-1,k=0;i>=0;i--)
 551   {
 552    int answer=k+change(t.num[i])*y;
 553    k=answer/10;
 554    answer=answer%10;
 555    arrays[i]=change(answer);
 556   }
 557   Bignum::runformer(arrays);
 558   Bignum z(arrays);
 559   return z;
 560  }
 561  else
 562   return t;
 563 }
 564 Bignum Bignum::multiplication(Bignum &x,char y)
 565 {
 566  Bignum z;
 567  z=Bignum::multiplication(x,change(y));
 568  return z;
 569 }
 570 Bignum Bignum::multiplication(Bignum &x,char y[100])
 571 {
 572  Bignum z(y);
 573  return Bignum::multiplication(x,z); 
 574 }
 575 Bignum Bignum::multiplication(Bignum &x,Bignum &y)
 576 {
 577  Bignum z("0");
 578  if(!x.ifhavef&&!y.ifhavef)
 579  {
 580   Bignum t1(x),t2(y);
 581   int l=Bignum::litude(t2);
 582   for(int t=l-1;t>=0;t--)
 583   {
 584    Bignum t3=Bignum::multiplication(t1,change(t2.num[t]));
 585    Bignum::run0(t1.num);
 586    z=z+t3;
 587   }
 588   Bignum::runformer(z.num);
 589   z.setf(false);
 590  }
 591  else if(x.ifhavef&&y.ifhavef)
 592   z=Bignum::multiplication(Bignum::anti(x),Bignum::anti(y));
 593  else if(x.ifhavef&&!y.ifhavef)
 594  {
 595   z=Bignum::multiplication(Bignum::anti(x),y);
 596   z.setf(true);
 597  }
 598  else
 599   z=Bignum::multiplication(y,x);
 600  z.test();
 601  return z;
 602 }
 603 //---
 604 //---
 605 //除法
 606 //===[char[100]置前]
 607 Bignum Bignum::division(char x[100],int y)
 608 {
 609  Bignum z(x);
 610  return z/y;
 611 }
 612 Bignum Bignum::division(char x[100],char y)
 613 {
 614  Bignum z(x);
 615  return z/y;
 616 }
 617 Bignum Bignum::division(char x[100],char y[100])
 618 {
 619  Bignum z(x);
 620  return z/y;
 621 }
 622 Bignum Bignum::division(char x[100],Bignum &y)
 623 {
 624  return x/y;
 625 }
 626 //===[Bignum置前] 
 627 Bignum Bignum::division(Bignum &x,int y)
 628 {
 629  Bignum z("0");
 630  if(!(y>0&&y<=9))
 631   return z;
 632  char arrays[100];
 633  Bignum t(x);
 634  int l=Bignum::litude(x);
 635  arrays[l]='';
 636  for(int i=0,k=0;i<l;i++)
 637  {
 638   int answer=k*10+change(x.num[i]);
 639   k=answer%y;
 640   answer=answer/y;
 641   arrays[i]=change(answer);
 642  }
 643  Bignum::runformer(arrays);
 644  z.set(arrays,false);
 645  z.test();
 646  return z;
 647 }
 648 Bignum Bignum::division(Bignum &x,char y)
 649 {
 650  Bignum z(Bignum::division(x,change(y)));
 651  return z;
 652 }
 653 Bignum Bignum::division(Bignum &x,char y[100])
 654 {
 655  return x/y;
 656 }
 657 Bignum Bignum::division(Bignum &x,Bignum &y)
 658 {
 659  Bignum z;
 660  if(!x.ifhavef&&!y.ifhavef)
 661  {
 662   z.setf(false);
 663   Bignum t1(x),t2(y);
 664   Bignum::runformer(t1.num);
 665   Bignum::runformer(t2.num);
 666   int l1,l2;
 667   l1=Bignum::litude(t1);
 668   l2=Bignum::litude(t2);
 669   if(l1<l2||strcmp(t1.num,t2.num)<0)
 670    z.setnum('0');
 671   else if(strcmp(t1.num,t2.num)==0)
 672    z.setnum('1');
 673   else if(l1==l2)
 674   {
 675    char f;
 676    f='2';
 677    while(Bignum::multiplication(t2,f)<t1)
 678     f++;
 679    f--;
 680    z.setnum(f);
 681   }
 682   else
 683   {
 684    z.setnum('0');
 685    for(int i=l1-l2;i>=0;i--)
 686    {
 687     Bignum t3(t2);
 688     Bignum::run0(t3.num,i);
 689     int k=0;
 690     while(t1>t3)
 691     {
 692      t1=t1-t3;
 693      k++;
 694     }
 695     z=z+Bignum::multiplication(k,Bignum::run1(i));
 696    }
 697   }
 698  }
 699  else if(x.ifhavef&&y.ifhavef)
 700   z=Bignum::division(Bignum::anti(x),Bignum::anti(y));
 701  else if(x.ifhavef&&!y.ifhavef)
 702   z=Bignum::anti(Bignum::division(Bignum::anti(x),y));
 703  else
 704   z=Bignum::anti(Bignum::division(x,Bignum::anti(y)));
 705  z.test();
 706  return z;
 707 }
 708 //---
 709 //---
 710 //求余数
 711 //===[char*置前]
 712 Bignum Bignum::rest(char x[100],int y)
 713 {
 714  Bignum z(x);
 715  return z%y;
 716 }
 717 Bignum Bignum::rest(char x[100],char y)
 718 {
 719  Bignum z(x);
 720  return z%y;
 721 }
 722 Bignum Bignum::rest(char x[100],char y[100])
 723 {
 724  Bignum z(x);
 725  return z%y;
 726 }
 727 Bignum Bignum::rest(char x[100],Bignum &y)
 728 {
 729  Bignum z(x);
 730  return z%y;
 731 }
 732 //===[Bignum置前]
 733 Bignum Bignum::rest(Bignum &x,int y)
 734 {
 735  return x%y;
 736 }
 737 Bignum Bignum::rest(Bignum &x,char y)
 738 {
 739  return x%y;
 740 }
 741 Bignum Bignum::rest(Bignum &x,char y[100])
 742 {
 743  return x%y;
 744 }
 745 Bignum Bignum::rest(Bignum &x,Bignum &y)
 746 {
 747  return x%y;
 748 }
 749 //---
 750 //---
 751 //求幂数 
 752 //===[int置前]
 753 Bignum Bignum::pxp(int x,int y)
 754 {
 755  return Bignum::pxp(change_ib(x),y);
 756 }
 757 Bignum Bignum::pxp(int x,char y)
 758 {
 759  return Bignum::pxp(change_ib(x),y);
 760 }
 761 Bignum Bignum::pxp(int x,char y[100])
 762 {
 763  return Bignum::pxp(change_ib(x),y);
 764 }
 765 Bignum Bignum::pxp(int x,Bignum &y)
 766 {
 767  return Bignum::pxp(change_ib(x),y);
 768 }
 769 //===[char置前]
 770 Bignum Bignum::pxp(char x,int y)
 771 {
 772  return Bignum::pxp(change_cb(x),y);
 773 }
 774 Bignum Bignum::pxp(char x,char y)
 775 {
 776  return Bignum::pxp(change_cb(x),y);
 777 }
 778 Bignum Bignum::pxp(char x,char y[100])
 779 {
 780  return Bignum::pxp(change_cb(x),y);
 781 }
 782 Bignum Bignum::pxp(char x,Bignum &y)
 783 {
 784  return Bignum::pxp(change_cb(x),y);
 785 }
 786 //===[char[100]置前]
 787 Bignum Bignum::pxp(char x[100],int y)
 788 {
 789  return Bignum::pxp(change_cbs(x),y);
 790 }
 791 Bignum Bignum::pxp(char x[100],char y)
 792 {
 793  return Bignum::pxp(change_cbs(x),y);
 794 }
 795 Bignum Bignum::pxp(char x[100],char y[100])
 796 {
 797  return Bignum::pxp(change_cbs(x),y);
 798 }
 799 Bignum Bignum::pxp(char x[100],Bignum &y)
 800 {
 801  return Bignum::pxp(change_cbs(x),y);
 802 }
 803 //===[Bignum置前]
 804 Bignum Bignum::pxp(Bignum &x,int y)
 805 {
 806  return Bignum::pxp(x,change_ib(y));
 807 }
 808 Bignum Bignum::pxp(Bignum &x,char y)
 809 {
 810  return Bignum::pxp(x,change_cb(y));
 811 }
 812 Bignum Bignum::pxp(Bignum &x,char y[100])
 813 {
 814  return Bignum::pxp(x,change_cbs(y));
 815 }
 816 Bignum Bignum::pxp(Bignum &x,Bignum &y)
 817 {
 818  x.test();x.test_s();
 819  y.test();y.test_s();
 820  Bignum::runformer(x.num);
 821  Bignum::runformer(y.num);
 822  Bignum t1(x),t2(y);
 823  if(!t1.ifhavef)
 824  {
 825   if(t1=='0')
 826    return change_ib(0);
 827   else if(t1=='1')
 828    return change_ib(1);
 829   if(t2=='0')
 830    return change_ib(1);
 831   else if(t2>0)
 832   {
 833    Bignum z(1);
 834    while(t2>0)
 835    {
 836     z=Bignum::multiplication(t1,z);
 837     t2--;
 838    }
 839    return z;
 840   }
 841   else
 842    return change_ib(0);
 843  }
 844  else if(t1.ifhavef)
 845  {
 846   if(t2%2==0)
 847    return Bignum::pxp(Bignum::anti(t1),t2);
 848   else
 849    return Bignum::anti(Bignum::pxp(Bignum::anti(t1),t2)); 
 850  }
 851  return t1;
 852 }
 853 //---
 854 //--------------<运算符重载>--------------//
 855 //--- 
 856 //加法
 857 //===[Bignum置前]
 858 Bignum operator +(Bignum &x,int y)
 859 {
 860  return x+change_ib(y);
 861 }
 862 Bignum operator +(Bignum &x,char y)
 863 {
 864  return x+change_cb(y);
 865 }
 866 Bignum operator +(Bignum &x,char y[100])
 867 {
 868  return x+change_cbs(y);
 869 }
 870 Bignum operator +(Bignum &x,Bignum &y)
 871 {
 872  Bignum zz;
 873  if(!x.ifhavef&&!y.ifhavef)
 874  {
 875   Bignum t1(x),t2(y);
 876   int l1,l2;
 877   l1=Bignum::litude(x);
 878   l2=Bignum::litude(y);
 879   //以上-----初步计算 
 880   if(l1==l2)
 881   {
 882    Bignum::runlatter(t1.num);
 883    Bignum::runlatter(t2.num);
 884    l1++;
 885    l2++;
 886   }
 887   else if(l1<l2)
 888   {
 889    Bignum::runlatter(t2.num);
 890    Bignum::runlatter(t1.num,l2-l1+1);
 891    l2++;
 892    l1=l2;
 893   }
 894   else if(l1>l2)
 895   {
 896    Bignum::runlatter(t1.num);
 897    Bignum::runlatter(t2.num,l1-l2+1);
 898    l1++;
 899    l2=l1;
 900   }
 901   char arrays[100];
 902   arrays[l1]='';
 903   //以上为规划
 904   for(int j=l1-1,k=0;j>=0;j--)
 905   {
 906    int answer=change(t1.num[j])+change(t2.num[j])+k;
 907    k=answer/10;
 908    arrays[j]=change(answer%10);
 909   } 
 910   Bignum::runformer(arrays);
 911   zz.setnum(arrays);
 912  }
 913  else if(x.ifhavef&&y.ifhavef)
 914   zz=Bignum::anti(Bignum::anti(x)+Bignum::anti(y));
 915  else if(x.ifhavef&&!y.ifhavef)
 916   zz=y-Bignum::anti(x);
 917  else
 918   Bignum zz=x-Bignum::anti(y);
 919  zz.test();
 920  return zz;
 921 }
 922 //===[Bignum置后]
 923 Bignum operator +(int x,Bignum &y)
 924 {
 925  return y+x;
 926 }
 927 Bignum operator +(char x,Bignum &y)
 928 {
 929  return y+x;
 930 }
 931 Bignum operator +(char x[100],Bignum &y)
 932 {
 933  return y+x;
 934 }
 935 //--- 
 936 //--- 
 937 //减法
 938 //===[Bignum置前]
 939 Bignum operator -(Bignum &x,int y)
 940 {
 941  return x-change_ib(y);
 942 }
 943 Bignum operator -(Bignum &x,char y)
 944 {
 945  return x-change_cb(y);
 946 }
 947 Bignum operator -(Bignum &x,char y[100])
 948 {
 949  return x-change_cbs(y);
 950 }
 951 Bignum operator -(Bignum &x,Bignum &y)
 952 {
 953  Bignum result;
 954  if(!x.ifhavef&&!y.ifhavef)
 955  {
 956   char arrays[100];
 957   bool resulthavef=false;
 958   Bignum t1(x),t2(y);
 959   int l1=Bignum::litude(x),l2=Bignum::litude(y);
 960   if(l1==l2)
 961   {
 962    Bignum::runlatter(t1.num);
 963    Bignum::runlatter(t2.num);
 964    l1++;
 965    l2++;
 966   }
 967   else if(l1<l2)
 968   {
 969    Bignum::runlatter(t2.num);
 970    Bignum::runlatter(t1.num,l2-l1+1);
 971    l2++;
 972    l1=l2;
 973   }
 974   else if(l1>l2)
 975   {
 976    Bignum::runlatter(t1.num);
 977    Bignum::runlatter(t2.num,l1-l2+1);
 978    l1++;
 979    l2=l1;
 980   }
 981   //统一排位
 982   Bignum t3(t1),t4(t2);
 983   if(strcmp(t1.num,t2.num)<0)
 984   {
 985    Bignum::exchange(t3,t4);
 986    result.ifhavef=true;
 987   }
 988  
 989   if(strcmp(t1.num,t2.num)==0)
 990   {
 991    arrays[0]='0';
 992    arrays[1]='';
 993   }
 994   else
 995   {
 996    arrays[l2]='';
 997    for(int j=l2-1,k=0;j>=0;j--)
 998    {
 999     int answer=change(t3.num[j])-change(t4.num[j])-k;
1000     if(answer<0)
1001     {
1002      k=1;
1003      answer=answer+10;
1004     }
1005     else
1006      k=0;
1007     arrays[j]=change(answer);
1008    } 
1009   }
1010   Bignum::runformer(arrays);
1011   result.setnum(arrays);
1012   result.setf(resulthavef);
1013  }
1014  else if(x.ifhavef&&y.ifhavef)
1015   result=Bignum::anti(y)-Bignum::anti(x);
1016  else if(x.ifhavef&&!y.ifhavef)
1017   result=Bignum::anti(Bignum::anti(x)+y);
1018  else
1019   result=Bignum::anti(y)+x;
1020  result.test();
1021  return result;
1022 }
1023 //===[Bignum置后]
1024 Bignum operator -(int x,Bignum &y)
1025 {
1026  return y-x;
1027 } 
1028 Bignum operator -(char x,Bignum &y)
1029 {
1030  return y-x;
1031 } 
1032 Bignum operator -(char x[100],Bignum &y)
1033 {
1034  return y-x;
1035 } 
1036 //---
1037 //---
1038 //除法
1039 //===[Bignum置前]
1040 Bignum operator /(Bignum &x,int y)
1041 {
1042  return x/change_ib(y);
1043 }
1044 Bignum operator /(Bignum &x,char y)
1045 {
1046  return x/change_cb(y);
1047 }
1048 Bignum operator /(Bignum &x,char y[100])
1049 {
1050  return x/change_cbs(y);
1051 }
1052 Bignum operator /(Bignum &x,Bignum &y)
1053 {
1054  Bignum z=Bignum::division(x,y);
1055  return z;
1056 }
1057 //===[Bignum置后]
1058 Bignum operator /(char x[100],Bignum &y)
1059 {
1060  return change_cbs(x)/y;
1061 }
1062 //---
1063 //---
1064 //求余数
1065 //===[Bignum置前]
1066 Bignum operator %(Bignum &x,int y)
1067 {
1068  return x%change_ib(y);
1069 }
1070 Bignum operator %(Bignum &x,char y)
1071 {
1072  return x%change_cb(y);
1073 }
1074 Bignum operator %(Bignum &x,char y[100])
1075 {
1076  return x%change_cbs(y);
1077 }
1078 Bignum operator %(Bignum &x,Bignum &y)
1079 {
1080  Bignum answer;
1081  answer.setf(false);
1082  Bignum t1(x),t2(y);
1083  if(t2.ifhavef||strcmp(t2.num,"0")==0)//除数不是正数
1084  {
1085   answer.setnum("0");
1086   return answer;
1087  }
1088  int l1,l2;
1089  Bignum::runformer(t1.num);
1090  Bignum::runformer(t2.num);
1091  l1=Bignum::litude(t1);
1092  l2=Bignum::litude(t2);
1093  if(!t1.ifhavef)
1094  {
1095   if(t1==t2)
1096    answer.setnum("0");
1097   else if(t1>t2)
1098   {
1099    if(l1==l2||l1==l2+1)
1100    {
1101     for(int i=1;i>=0;i--)
1102     {
1103      Bignum t3(t2);     
1104      Bignum::run0(t3.num,i);
1105      while(t1>t3)
1106       t1=t1-t3;
1107     }
1108     answer.setnum(t1.num);
1109    }
1110    else
1111    {
1112     int i;
1113     for(i=l1-l2;i>=0;i--)
1114     {
1115      Bignum t3(t2);
1116      Bignum::run0(t3.num,i);
1117      while(t1>t3)
1118       t1=t1-t3;
1119     }
1120     answer.setnum(t1.num);
1121    }
1122   }
1123   else
1124    answer=t2;
1125  }
1126  else if(t1.ifhavef)
1127  {
1128   if(Bignum::anti(t1)==t2)
1129    answer.setnum("0");
1130   else if(Bignum::anti(t1)>t2)
1131    answer=t2-(Bignum::anti(t1)%t2);
1132   else
1133    answer=t1+t2;
1134  }
1135  answer.test();
1136  return answer;
1137 }
1138 //===[Bignum置后]
1139 Bignum operator %(char x[100],Bignum &y)
1140 {
1141  return change_cbs(x)%y;
1142 }
1143 //---
1144 //---
1145 //单目运算符
1146 //===[++运算]
1147 //---
1148 //======[前置++](绝对值) 
1149 Bignum Bignum::operator ++()
1150 {
1151  test();
1152  Bignum::runformer(this->num); 
1153  ifhavef=false;
1154  return *this;
1155 }
1156 //--- 
1157 //======[后置++](数值运算) 
1158 Bignum Bignum::operator ++(int x)
1159 {
1160  test();
1161  Bignum::runformer(this->num);
1162  *this=*this+1;
1163  return *this;
1164  
1165 }
1166 //===[--运算]
1167 //---
1168 //======[前置--](相反数)
1169 Bignum Bignum::operator --()
1170 {
1171  test();
1172  Bignum::runformer(this->num);
1173  ifhavef=!ifhavef;
1174  return *this;
1175 }
1176 //--- 
1177 //======[后置--](数值运算)
1178 Bignum Bignum::operator --(int x)
1179 {
1180  test();
1181  Bignum::runformer(this->num);
1182  *this=*this-1; 
1183  return *this;
1184 }
1185 //---
1186 //---
1187 //比较函数
1188 //===[小于]
1189 //---
1190 //======[Bignum置前]
1191 bool operator <(Bignum &x,int y)
1192 {
1193  return change_ib(y)<x;
1194 }
1195 bool operator <(Bignum &x,char y)
1196 {
1197  return change_cb(y)<x;
1198 }
1199 bool operator <(Bignum &x,char y[100])
1200 {
1201  return change_cbs(y)<x;
1202 } 
1203 bool operator <(Bignum &x,Bignum &y)
1204 {
1205  x.test();
1206  Bignum::runformer(x.num);
1207  y.test();
1208  Bignum::runformer(y.num);
1209  int l1,l2;
1210  l1=Bignum::litude(x);
1211  l2=Bignum::litude(y);
1212  bool it=false;
1213  if(x.ifhavef&&y.ifhavef)
1214  {
1215   if(l1==l2)
1216    it=strcmp(x.num,y.num)>0;
1217   else if(l1>l2)
1218    it=!it;
1219  }
1220  else if(!x.ifhavef&&!y.ifhavef)
1221  {
1222   if(l1==l2)
1223    it=strcmp(x.num,y.num)<0;
1224   else if(l2>l1)
1225    it=!it;
1226  }
1227  else if(!x.ifhavef&&y.ifhavef)
1228   it=!it;
1229  return it;
1230 }
1231 //======[Bignum置后]
1232 bool operator <(int x,Bignum &y)
1233 {
1234  return change_ib(x)<y;
1235 }
1236 bool operator <(char x,Bignum &y)
1237 {
1238  return change_cb(x)<y;
1239 }
1240 bool operator <(char x[100],Bignum &y)
1241 {
1242  return change_cbs(x)<y;
1243 }
1244 //---
1245 //===[大于]
1246 //---
1247 //======[Bignum置前] 
1248 bool operator >(Bignum &x,int y)
1249 {
1250  return change_ib(y)>x;
1251 }
1252 bool operator >(Bignum &x,char y)
1253 {
1254  return change_cb(y)>x;
1255 }
1256 bool operator >(Bignum &x,char y[100])
1257 {
1258  return change_cbs(y)>x;
1259 } 
1260 bool operator >(Bignum &x,Bignum &y)
1261 {
1262  return y<x;
1263 }
1264 //======[Bignum置后]
1265 bool operator >(int x,Bignum &y)
1266 {
1267  return change_ib(x)>y;
1268 }
1269 bool operator >(char x,Bignum &y)
1270 {
1271  return change_cb(x)>y;
1272 }
1273 bool operator >(char x[100],Bignum &y)
1274 {
1275  return change_cbs(x)>y;
1276 }
1277 //---
1278 //===[等于]
1279 //---
1280 //======[Bignum置前] 
1281 bool operator ==(Bignum &x,int y)
1282 {
1283  return change_ib(y)==x;
1284 }
1285 bool operator ==(Bignum &x,char y)
1286 {
1287  return change_cb(y)==x;
1288 }
1289 bool operator ==(Bignum &x,char y[100])
1290 {
1291  return change_cbs(y)==x;
1292 }
1293 bool operator ==(Bignum &x,Bignum &y)
1294 {
1295  return strcmp(x.num,y.num)!=0&&Bignum::ifsamelong(x,y);
1296 }
1297 //======[Bignum置后]
1298 bool operator ==(int x,Bignum &y)
1299 {
1300  return change_ib(x)==y;
1301 }
1302 bool operator ==(char x,Bignum &y)
1303 {
1304  return change_cb(x)==y;
1305 }
1306 bool operator ==(char x[100],Bignum &y)
1307 {
1308  return change_cbs(x)==y;
1309 }
1310 //---
1311 //===[不等于]
1312 //---
1313 //======[Bignum置前] 
1314 bool operator !=(Bignum &x,int y)
1315 {
1316  return change_ib(y)!=x;
1317 }
1318 bool operator !=(Bignum &x,char y)
1319 {
1320  return change_cb(y)!=x;
1321 }
1322 bool operator !=(Bignum &x,char y[100])
1323 {
1324  return change_cbs(y)!=x;
1325 }
1326 bool operator !=(Bignum &x,Bignum &y)
1327 {
1328  return !(x==y);
1329 }
1330 //======[Bignum置后]
1331 bool operator !=(int x,Bignum &y)
1332 {
1333  return change_ib(x)!=y;
1334 }
1335 bool operator !=(char x,Bignum &y)
1336 {
1337  return change_cb(x)!=y;
1338 }
1339 bool operator !=(char x[100],Bignum &y)
1340 {
1341  return change_cbs(x)!=y;
1342 }
1343 //---
1344 //===[小于或等于]
1345 //---
1346 //======[Bignum置前]
1347 bool operator <=(Bignum &x,int y)
1348 {
1349  return change_ib(y)<=x;
1350 }
1351 bool operator <=(Bignum &x,char y)
1352 {
1353  return change_cb(y)<=x;
1354 }
1355 bool operator <=(Bignum &x,char y[100])
1356 {
1357  return change_cbs(y)<=x;
1358 }
1359 bool operator <=(Bignum &x,Bignum &y)
1360 {
1361  return (x<y)||(x==y);
1362 }
1363 //======[Bignum置后]
1364 bool operator <=(int x,Bignum &y)
1365 {
1366  return change_ib(x)<=y;
1367 }
1368 bool operator <=(char x,Bignum &y)
1369 {
1370  return change_cb(x)<=y;
1371 }
1372 bool operator <=(char x[100],Bignum &y)
1373 {
1374  return change_cbs(x)<=y;
1375 }
1376 //---
1377 //===[大于或等于]
1378 //---
1379 //======[Bignum置前] 
1380 bool operator >=(Bignum &x,int y)
1381 {
1382  return change_ib(y)>=x;
1383 }
1384 bool operator >=(Bignum &x,char y)
1385 {
1386  return change_cb(y)>=x;
1387 }
1388 bool operator >=(Bignum &x,char y[100])
1389 {
1390  return change_cbs(y)>=x;
1391 }
1392 bool operator >=(Bignum &x,Bignum &y)
1393 {
1394  return (y<x)||(x==y);
1395 }
1396 //======[Bignum置后]
1397 bool operator >=(int x,Bignum &y)
1398 {
1399  return change_ib(x)>=y;
1400 }
1401 bool operator >=(char x,Bignum &y)
1402 {
1403  return change_cb(x)>=y;
1404 }
1405 bool operator >=(char x[100],Bignum &y)
1406 {
1407  return change_cbs(x)>=y;
1408 }
1409 //---
1410 //--- 
1411 //输入输出流 
1412 //===[输入]
1413 istream & operator >>(istream &in,Bignum &x)
1414 {
1415  char str[100];
1416  in>>str;
1417  x.setf(false);
1418  if(str[0]=='-')
1419  {
1420   str[0]='0';
1421   x.setf(true);
1422   Bignum::runformer(str);
1423  }
1424  x.setnum(str);
1425  x.test();
1426  return in;
1427 }
1428 //===[输出] 
1429 ostream & operator <<(ostream &out,Bignum &x)
1430 {
1431  x.test();
1432  if(x.ifhavef)
1433   out<<'-';
1434  out<<x.num;
1435  return out;
1436 }
1437 //---
1438 //--------------<构造和析构函数>--------------//
1439 //--- 
1440 //构造函数
1441 //===无参构造函数 
1442 Bignum::Bignum()
1443 {
1444  ifhavef=false;
1445  num[0]='1';
1446  num[1]='0';
1447  num[2]='0';
1448  num[3]='';
1449 }
1450 //===转换构造函数
1451 Bignum::Bignum(int x)
1452 {
1453  Bignum(change_ib(x));
1454 }
1455 Bignum::Bignum(char p)
1456 {
1457  ifhavef=false;
1458  num[0]=p;
1459  num[1]='';
1460 }
1461 Bignum::Bignum(char p[100])
1462 {
1463  ifhavef=false;
1464  if(p[0]!='-')
1465   strcpy(num,p);
1466  else
1467  {
1468   char temp[100];
1469   for(int i=0;i<99;i++)
1470    temp[i]=p[i+1];
1471   temp[99]='';
1472   strcpy(num,temp);
1473   ifhavef=true; 
1474  }
1475  test();
1476 }
1477 //===拷贝构造函数 
1478 Bignum::Bignum(Bignum &x)
1479 {
1480  ifhavef=x.ifhavef;
1481  strcpy(num,x.num);
1482  test();
1483 }
1484 //---
1485 //--- 
1486 //析构函数 
1487 Bignum::~Bignum()
1488 {
1489  
1490 }
Bignum.cpp
原文地址:https://www.cnblogs.com/onepersonwholive/p/9336510.html