无限精度运算

 

花费了一个寒假而写出来的神奇代码。

在七月大热天想与大家分享。

觉得我的代码丑的

勿喷

 

 

   1 #include<typeinfo>
   2 #include<vector>
   3 #include<string>
   4 #include<iostream>
   5 #include<cstdio>
   6 #include<cstdlib>
   7 namespace tool{
   8 #ifndef __terminate__
   9 #define __terminate__(X) (printf(X),exit(-1))
  10 #endif
  11 #define EQUAL_TYPENAME(x,y) (typeid(x)==typeid(y))
  12   template<typename __Tp>
  13     inline bool is_integer(const __Tp& expr)
  14     {
  15         return
  16 #ifdef _INT128_DEFINED
  17             EQUAL_TYPENAME(__Tp,__int128)|| 
  18 #endif               
  19             EQUAL_TYPENAME(__Tp,short) || 
  20             EQUAL_TYPENAME(__Tp,int) || 
  21             EQUAL_TYPENAME(__Tp,long) || 
  22             EQUAL_TYPENAME(__Tp,long long) ||
  23 #if __cplusplus>=201103L
  24             EQUAL_TYPENAME(__Tp,char16_t) ||
  25             EQUAL_TYPENAME(__Tp,char32_t) ||
  26 #endif/*cplusplus*/
  27             EQUAL_TYPENAME(__Tp,char) ||
  28             EQUAL_TYPENAME(__Tp,wchar_t);
  29     }
  30   template<typename __Tp>
  31     inline bool is_decimal(const __Tp& expr)
  32     {
  33         return
  34 #ifdef _FLOAT128_DEFINED
  35             EQUAL_TYPENAME(__Tp,__float128)|| 
  36 #endif               
  37             EQUAL_TYPENAME(__Tp,float) || 
  38             EQUAL_TYPENAME(__Tp,double) || 
  39             EQUAL_TYPENAME(__Tp,long double);
  40     }
  41   template<typename __Tp>
  42     inline bool is_boolean(const __Tp& expr)
  43     {
  44         return 
  45             EQUAL_TYPENAME(__Tp,bool);
  46     }
  47   template<typename __Tp>
  48     inline bool is_character(const __Tp& expr)
  49     {
  50         return
  51 #if __cplusplus>=201103L
  52             EQUAL_TYPENAME(__Tp,char16_t) ||
  53             EQUAL_TYPENAME(__Tp,char32_t) ||
  54 #endif/*cplusplus*/
  55             EQUAL_TYPENAME(__Tp,char) ||
  56             EQUAL_TYPENAME(__Tp,wchar_t);
  57     }
  58     struct integer_list;
  59     struct decimal_list;
  60     struct bit_of_dec
  61     {
  62         signed char data;
  63         bit_of_dec(){data=(signed char)(0);}
  64         ~bit_of_dec(){}
  65         
  66         operator char()
  67             {return data;}
  68         bit_of_dec(const bit_of_dec&other)
  69             {data=other.data;return;}
  70         bit_of_dec(const char&other)
  71             {data=other;return;}
  72         bit_of_dec&operator=(const bit_of_dec&other)
  73             {data=other.data;return *this;}
  74         template<typename __Tp>
  75         bit_of_dec(const __Tp&other)
  76             {data=other;return;}
  77         template<typename __Tp>
  78         bit_of_dec&operator=(const __Tp&other)
  79             {data=other;return *this;}
  80 
  81 #define bitop(op)\
  82     friend bit_of_dec operator op \
  83     (const bit_of_dec&t,const bit_of_dec&other) \
  84     { \
  85         return t.data op other.data; \
  86     }
  87 #define bitopself(op) \
  88     bit_of_dec&operator op \
  89     (const bit_of_dec&other) \
  90     { \
  91         data op other.data; \
  92         return *this; \
  93     }
  94 #define bitboolop(op) \
  95     friend bool operator op \
  96     (const bit_of_dec&t,const bit_of_dec&other) \
  97     { \
  98         return t.data op other.data; \
  99     }
 100 #define bitopt(op) \
 101     template<typename __Tp> \
 102     friend bit_of_dec operator op \
 103     (const bit_of_dec&t,const __Tp&other) \
 104     { \
 105         static char c; \
 106         c=other; \
 107         return t.data op c; \
 108     }        
 109 #define bitopselft(op) \
 110     template<typename __Tp> \
 111     bit_of_dec&operator op \
 112     (const __Tp&other) \
 113     { \
 114         data op other; \
 115         return *this; \
 116     }
 117 #define bitboolopt(op) \
 118     template<typename __Tp> \
 119     friend bool operator op \
 120     (const bit_of_dec&t,const __Tp&other) \
 121     { \
 122         return t.data op other; \
 123     }
 124         bitop(+)
 125         bitop(-)
 126         bitop(*)
 127         bitop(/)
 128         bitop(%)
 129         bitopself(+=)
 130         bitopself(-=)
 131         bitopself(*=)
 132         bitopself(/=)
 133         bitopself(%=)
 134         bitboolop(<)
 135         bitboolop(<=)
 136         bitboolop(>=)
 137         bitboolop(>)
 138         bitboolop(!=)
 139         bitboolop(==)
 140         bitopt(+)
 141         bitopt(-)
 142         bitopt(*)
 143         bitopt(/)
 144         bitopt(%)
 145         bitopselft(+=)
 146         bitopselft(-=)
 147         bitopselft(*=)
 148         bitopselft(/=)
 149         bitopselft(%=)
 150         bitboolopt(<)
 151         bitboolopt(<=)
 152         bitboolopt(>=)
 153         bitboolopt(>)
 154         bitboolopt(!=)
 155         bitboolopt(==)
 156 #undef bitop
 157 #undef bitopt
 158 #undef bitopself
 159 #undef bitopselft
 160 #undef bitboolop
 161 #undef bitboolopt
 162     };
 163     struct integer_list
 164     {
 165         friend struct decimal_list;
 166         
 167         typedef bit_of_dec                         bit_type;
 168         typedef std::vector<bit_type>             list;
 169         typedef typename list::reference        reference;
 170         typedef typename list::const_reference    const_reference;
 171         typedef typename list::difference_type    ctrl_type;
 172         typedef integer_list                    self;
 173         
 174         list l;
 175         
 176         integer_list(){}
 177         ~integer_list(){}
 178         
 179         void clear()
 180         {
 181             l.clear();
 182         }
 183         self&operator=(const self&other)
 184         {
 185             l=other.l;
 186             return *this;
 187         }
 188         self&operator=(const decimal_list&other);
 189         reference operator[](const ctrl_type&subsize)
 190         {
 191             return l[subsize];
 192         }
 193         const_reference operator[](const ctrl_type&subsize)const
 194         {
 195             return l[subsize];
 196         }
 197         ctrl_type minnum()const
 198         {
 199             return 0;
 200         }
 201         ctrl_type maxnum()const
 202         {
 203             return l.size()-1;
 204         }
 205         
 206         void resize(const ctrl_type&max_subsize)
 207         {
 208             l.resize(max_subsize+1);
 209         }
 210         reference build(const ctrl_type&subsize)
 211         {
 212             if(subsize>maxnum())l.resize(subsize+1);
 213             return l[subsize];
 214         }
 215     };
 216     struct decimal_list
 217     {
 218         friend struct integer_list;
 219         
 220         typedef bit_of_dec                         bit_type;
 221         typedef std::vector<bit_type>             list;
 222         typedef typename list::reference        reference;
 223         typedef typename list::const_reference    const_reference;
 224         typedef typename list::difference_type    ctrl_type;
 225         typedef decimal_list                    self;
 226         
 227         list front,back;
 228         
 229         decimal_list(){}
 230         ~decimal_list(){}
 231         
 232         void clear()
 233         {
 234             front.clear();
 235             back.clear();
 236         }
 237         self&operator=(const self&other)
 238         {
 239             front=other.front;
 240             back=other.back;
 241             return *this;
 242         }
 243         self&operator=(const integer_list&other);
 244 
 245         reference operator[](const ctrl_type&subsize)
 246         {
 247             return subsize>=0?back[subsize]:front[-subsize-1];
 248         }
 249         const_reference operator[](const ctrl_type&subsize)const
 250         {
 251             return subsize>=0?back[subsize]:front[-subsize-1];
 252         }
 253         ctrl_type minnum()const
 254         {
 255             return -1*front.size();
 256         }
 257         ctrl_type maxnum()const
 258         {
 259             return back.size()-1;
 260         }
 261         
 262         void resize(const ctrl_type&max_or_min_subsize)
 263         {
 264             if(max_or_min_subsize>0)back.resize(max_or_min_subsize+1);
 265             else if(max_or_min_subsize==0)back.clear(),front.clear();
 266             else front.resize(-max_or_min_subsize);
 267         }
 268         reference build(const ctrl_type&subsize)
 269         {
 270             if(subsize>=0)
 271             {
 272                 if(subsize>maxnum())back.resize(subsize+1);
 273                 return back[subsize];
 274             }
 275             else
 276             {
 277                 if(subsize<minnum())front.resize(-subsize);
 278                 return front[-subsize-1];
 279             }
 280         }
 281     };
 282     integer_list& integer_list::operator=(const decimal_list&other)
 283         {l=other.back;return *this;}        
 284     decimal_list& decimal_list::operator=(const integer_list&other) 
 285         {back=other.l;front.clear();return *this;}
 286 #define str_num_base(X) #X
 287 #define str_num(X) str_num_base(X)
 288     class integer;
 289     class decimal;
 290     class integer:private integer_list
 291     {
 292         private:
 293             friend class decimal;
 294             integer_list l;
 295             bool sign;    
 296             void clear()
 297             {
 298                 sign=false;
 299                 l.clear();
 300             }
 301             void del_zero()
 302             {
 303                 while(l.l.back()==bit_of_dec(0)&&l.l.size()>0)l.l.pop_back();
 304                 if(l.l.size()==0)sign=false;
 305             }
 306             integer abs()const
 307             {
 308                 static integer res;
 309                 res=*this;
 310                 res.sign=false;
 311                 return res;
 312             }
 313             integer oppo()const
 314             {
 315                 static integer res;
 316                 res=*this;
 317                 res.sign=!res.sign;
 318                 return res;
 319             }
 320             void move(ctrl_type num)//->+INF
 321             {
 322                 if(num==0)return ;
 323                 ctrl_type smax=l.maxnum(),smin=l.minnum(); 
 324                 if(num>0||num+l.maxnum()>=0)l.build(num+l.maxnum());
 325                 else if(num+l.maxnum()<0)
 326                 {
 327                     l.clear();
 328                     return;
 329                 }
 330                 if(num>0)
 331                     for(ctrl_type i=smax;i>=smin;--i)l.build(num+i)=l.build(i),l.build(i)=0;
 332                 else if(num<0)
 333                     for(ctrl_type i=-num;i<=smax;++i)l.build(i+num)=l.build(i),l.build(i)=0;
 334                 if(num>0)l.resize(num+smax);
 335                 del_zero();
 336             }
 337             void get()
 338             {
 339                 std::string buffer;
 340                 std::cin>>buffer;
 341                 operator=(buffer);
 342             }
 343             void put()const
 344             {
 345                 if(l.maxnum()<0)putchar('0');
 346                 if(sign)putchar('-');
 347                 for(integer_list::ctrl_type i=l.maxnum();i>=0;i--)putchar(l[i]+48);
 348                 return;
 349             }
 350         public:
 351             //let operator
 352             integer&operator=(const integer&other);
 353             integer&operator=(const decimal&other);
 354             integer&operator=(const std::string& str);
 355             integer&operator=(const std::wstring& str);
 356             integer&operator=(const char* str);
 357             integer&operator=(const wchar_t* str);
 358           template<typename __Tp>
 359             integer&operator=(__Tp expr);        
 360             //construct,copy_struct,destruct
 361           template<typename __Tp>
 362             integer(const __Tp&expr){operator=(expr);}
 363             integer(){sign=false;}
 364             ~integer(){} 
 365             
 366             integer_list::ctrl_type maxinum()
 367             {
 368                 return l.maxnum() ;
 369             }
 370             integer_list::ctrl_type mininum()
 371             {
 372                 return l.minnum() ;
 373             }
 374             //relational operator
 375             friend bool operator<(const integer&a,const integer&b);
 376             friend bool operator==(const integer&a,const integer&b);
 377             friend bool operator>(const integer&a,const integer&b);
 378             friend bool operator<=(const integer&a,const integer&b);
 379             friend bool operator>=(const integer&a,const integer&b);
 380             friend bool operator!=(const integer&a,const integer&b);
 381             //arithmetic operator
 382             friend integer operator+(const integer&a,const integer&b);
 383             friend integer operator-(const integer&a,const integer&b);
 384             friend integer operator*(const integer&a,const integer&b);
 385             friend integer operator/(const integer&a,const integer&b);
 386             friend integer operator%(const integer&a,const integer&b);
 387             friend integer operator<<(const integer&t,const ctrl_type&s);
 388             friend integer operator>>(const integer&t,const ctrl_type&s);
 389             
 390             integer& operator+=(const integer&b);
 391             integer& operator-=(const integer&b);
 392             integer& operator*=(const integer&b);
 393             integer& operator/=(const integer&b);
 394             integer& operator%=(const integer&b);
 395             integer& operator<<=(const ctrl_type&b);
 396             integer& operator>>=(const ctrl_type&b);
 397             
 398             integer&operator++();
 399             integer operator++(int);
 400             integer&operator--();
 401             integer operator--(int);
 402             
 403             integer operator+()const;
 404             integer operator-()const; 
 405             //io operator
 406             friend std::istream&operator>>(std::istream&,integer&);
 407             friend std::ostream&operator<<(std::ostream&,const integer&);
 408     };
 409     class decimal:private decimal_list
 410     {
 411         private:
 412             friend class integer;
 413             decimal_list l;
 414             bool sign;
 415             void clear()
 416             {
 417                 sign=false;
 418                 l.clear();
 419             }
 420             void del_zero()
 421             {
 422                 while(l.back.size()>0&&l.back.back()==bit_of_dec(0))l.back.pop_back();
 423                 while(l.front.size()>0&&l.front.back()==bit_of_dec(0))l.front.pop_back();
 424                 if(l.back.empty()&&l.front.empty())sign=false;
 425             }
 426             decimal abs()const
 427             {
 428                 static decimal res;
 429                 res=*this;
 430                 res.sign=false;
 431                 return res;
 432             }
 433             decimal oppo()const
 434             {
 435                 static decimal res;
 436                 res=*this;
 437                 res.sign=!res.sign;
 438                 return res;
 439             }
 440             void move(ctrl_type num)//->+INF
 441             {
 442                 ctrl_type smax=l.maxnum(),smin=l.minnum(); 
 443                 l.build(num+l.maxnum());
 444                 l.build(num+l.minnum());
 445                 if(num>0)
 446                     for(ctrl_type i=smax;i>=smin;--i)l.build(num+i)=l.build(i),l.build(i)=0;
 447                 else if(num<0)
 448                     for(ctrl_type i=smin;i<=smax;++i)l.build(i+num)=l.build(i),l.build(i)=0;
 449                 
 450                 if(num>0)l.resize(num+smax);
 451                 if(num<0)l.resize(num+smin);
 452                 del_zero();
 453             }
 454             void get()
 455             {
 456                 std::string buffer;
 457                 std::cin>>buffer;
 458                 operator=(buffer);
 459                 return;
 460             }
 461             void put()const
 462             {
 463                 if(sign)putchar('-');
 464                 if(l.maxnum()<0)
 465                 {
 466                     putchar('0');
 467                 }
 468                 for(decimal_list::ctrl_type i=l.maxnum();i>=0;i--)putchar(l[i]+48);
 469                 if(l.minnum()<0)putchar('.');
 470                 for(decimal_list::ctrl_type i=-1;i>=l.minnum();i--)putchar(l[i]+48);
 471                 return;
 472             }
 473         public:
 474             //let operator
 475             decimal&operator=(const integer&other);
 476             decimal&operator=(const decimal&other);
 477             decimal&operator=(const std::string& str);
 478             decimal&operator=(const std::wstring& str);
 479             decimal&operator=(const char* str);
 480             decimal&operator=(const wchar_t* str);
 481           template<typename __Tp>
 482             decimal&operator=(__Tp expr);
 483             //construct,copy_struct,destruct            
 484           template<typename __Tp>
 485               decimal(const __Tp&expr){operator=(expr);}
 486             decimal(){sign=false;}
 487             ~decimal(){}
 488             
 489             decimal_list::ctrl_type maxinum()
 490             {
 491                 return l.maxnum() ;
 492             }
 493             decimal_list::ctrl_type mininum()
 494             {
 495                 return l.minnum() ;
 496             }
 497             //relational operator
 498             friend bool operator<(const decimal&a,const decimal&b);
 499             friend bool operator==(const decimal&a,const decimal&b);
 500             friend bool operator>(const decimal&a,const decimal&b);
 501             friend bool operator<=(const decimal&a,const decimal&b);
 502             friend bool operator>=(const decimal&a,const decimal&b);
 503             friend bool operator!=(const decimal&a,const decimal&b);
 504             //arithmetic operator
 505             friend decimal operator+(const decimal&a,const decimal&b);
 506             friend decimal operator-(const decimal&a,const decimal&b);
 507             friend decimal operator*(const decimal&a,const decimal&b);
 508             friend decimal operator/(const decimal&a,const decimal&b);
 509             friend decimal operator<<(const decimal&t,const ctrl_type&s);
 510             friend decimal operator>>(const decimal&t,const ctrl_type&s);
 511             
 512             decimal& operator+=(const decimal&b);
 513             decimal& operator-=(const decimal&b);
 514             decimal& operator*=(const decimal&b);
 515             decimal& operator/=(const decimal&b);
 516             decimal& operator<<=(const ctrl_type&b);
 517             decimal& operator>>=(const ctrl_type&b);
 518             
 519             decimal&operator++();
 520             decimal operator++(int);
 521             decimal&operator--();
 522             decimal operator--(int);
 523             
 524             decimal operator+()const;
 525             decimal operator-()const;
 526             //io operator
 527             friend std::istream&operator>>(std::istream&,decimal&);
 528             friend std::ostream&operator<<(std::ostream&,const decimal&);
 529     };
 530 //function
 531     integer& integer::operator=(const integer&other)
 532         {l=other.l;sign=other.sign;return *this;}
 533     integer& integer::operator=(const decimal&other)
 534         {l=other.l;sign=other.sign;return *this;}
 535     decimal& decimal::operator=(const integer&other)
 536         {l=other.l;sign=other.sign;return *this;}
 537     decimal& decimal::operator=(const decimal&other)
 538         {l=other.l;sign=other.sign;return *this;}
 539     integer& integer::operator=(const std::string& str)
 540     {
 541         clear();
 542         ctrl_type i=0;
 543         std::vector<unsigned char>vec;
 544         while(str[i]==' '&&i!=(ctrl_type)str.size())++i;
 545         if(i==(ctrl_type)str.size())__terminate__("No data!");
 546         if(str.size()>1&&(str[i]=='+'||str[i]=='-'))sign=(str[i]=='+')?0:1,++i;
 547         else if(str.size()==1&&(str[i]=='+'||str[i]=='-'))
 548         {
 549             clear();
 550             __terminate__("Data error!");
 551         }
 552         while(i<(ctrl_type)str.size())
 553         {
 554             while(str[i]==' ')++i;
 555             if(str[i]>='0'&&str[i]<='9')vec.push_back(str[i]-'0');
 556             else if(str[i]=='.')
 557             {
 558                 ++i;
 559                 bool err=true;
 560                 while(i<(ctrl_type)str.size())
 561                 {
 562                     if(str[i]==' '||(str[i]>='0'&&str[i]<='9'))++i,err=(str[i]==' '?err:false);
 563                     else 
 564                     {
 565                         clear();
 566                         __terminate__("Data error!");
 567                     }
 568                 }
 569                 if(err)
 570                 {
 571                     clear();
 572                     __terminate__("Data error!");
 573                 }
 574             }
 575             else
 576             {
 577                 clear();
 578                 __terminate__("Data error!");
 579             }
 580             ++i;
 581         }
 582         for(i=0;i!=(ctrl_type)vec.size();++i)l.build(vec.size()-1-i)=vec[i];
 583         del_zero();
 584         return *this;
 585     }
 586     integer& integer::operator=(const std::wstring& str)
 587     {
 588         clear();
 589         ctrl_type i=0;
 590         std::vector<unsigned char>vec;
 591         while(str[i]==L' '&&i!=(ctrl_type)str.size())++i;
 592         if(i==(ctrl_type)str.size())__terminate__("No data!");
 593         if(str.size()>1&&(str[i]==L'+'||str[i]==L'-'))sign=(str[i]==L'+')?0:1,++i;
 594         else if(str.size()==1&&(str[i]==L'+'||str[i]==L'-'))
 595         {
 596             clear();
 597             __terminate__("Data error!");
 598         }
 599         while(i<(ctrl_type)str.size())
 600         {
 601             while(str[i]==L' ')++i;
 602             if(str[i]>=L'0'&&str[i]<=L'9')vec.push_back(str[i]-L'0');
 603             else if(str[i]==L'.')
 604             {
 605                 ++i;
 606                 bool err=true;
 607                 while(i<(ctrl_type)str.size())
 608                 {
 609                     if(str[i]==L' '||(str[i]>=L'0'&&str[i]<=L'9'))++i,err=(str[i]==L' '?err:false);
 610                     else 
 611                     {
 612                         clear();
 613                         __terminate__("Data error!");
 614                     }
 615                 }
 616                 if(err)
 617                 {
 618                     clear();
 619                     __terminate__("Data error!");
 620                 }
 621             }
 622             else
 623             {
 624                 clear();
 625                 __terminate__("Data error!");
 626             }
 627             ++i;
 628         }
 629         for(i=0;i!=(ctrl_type)vec.size();++i)l.build(vec.size()-1-i)=vec[i];
 630         del_zero();
 631         return *this;
 632     }
 633     decimal& decimal::operator=(const std::string& str)
 634     {
 635         clear();
 636         ctrl_type i=0;
 637         std::vector<unsigned char>vec;
 638         while(str[i]==' '&&i!=(ctrl_type)str.size())++i;
 639         if(i==(ctrl_type)str.size())__terminate__("No data!");
 640         if(str.size()>1&&(str[i]=='+'||str[i]=='-'))sign=(str[i]=='+')?0:1,++i;
 641         else if(str.size()==1&&(str[i]=='+'||str[i]=='-'))
 642         {
 643             clear();
 644             __terminate__("Data error!");
 645         }
 646         while(i!=(ctrl_type)str.size())
 647         {
 648             while(str[i]==' ')++i;
 649             if(str[i]>='0'&&str[i]<='9')vec.push_back(str[i]-'0');
 650             else if(str[i]=='.')
 651             {
 652                 ++i;
 653                 break;
 654             }
 655             else
 656             {
 657                 clear();
 658                 __terminate__("Data error!");
 659             }
 660             ++i;
 661         }
 662         while(i!=(ctrl_type)str.size())
 663         {
 664             while(str[i]==' ')++i;
 665             if(str[i]>='0'&&str[i]<='9')l.build(l.minnum()-1)=str[i]-'0';
 666             else{
 667                 clear();
 668                 __terminate__("Data error!");
 669             }
 670             ++i;
 671         }
 672         for(i=0;i!=(ctrl_type)vec.size();++i)l.build(vec.size()-1-i)=vec[i];
 673         del_zero();
 674         return *this;
 675     }
 676     decimal& decimal::operator=(const std::wstring& str)
 677     {
 678         clear();
 679         ctrl_type i=0;
 680         std::vector<unsigned char>vec;
 681         while(str[i]==L' '&&i!=(ctrl_type)str.size())++i;
 682         if(i==(ctrl_type)str.size())__terminate__("No data!");
 683         if(str.size()>1&&(str[i]==L'+'||str[i]==L'-'))sign=(str[i]==L'+')?0:1,++i;
 684         else if(str.size()==1&&(str[i]==L'+'||str[i]==L'-'))
 685         {
 686             clear();
 687             __terminate__("Data error!");
 688         }
 689         while(i!=(ctrl_type)str.size())
 690         {
 691             while(str[i]==L' ')++i;
 692             if(str[i]>=L'0'&&str[i]<=L'9')vec.push_back(str[i]-L'0');
 693             else if(str[i]==L'.')
 694             {
 695                 ++i;
 696                 break;
 697             }
 698             else
 699             {
 700                 clear();
 701                 __terminate__("Data error!");
 702             }
 703             ++i;
 704         }
 705         while(i!=(ctrl_type)str.size())
 706         {
 707             while(str[i]==' ')++i;
 708             if(str[i]>=L'0'&&str[i]<=L'9')l.build(l.minnum()-1)=str[i]-L'0';
 709             else{
 710                 clear();
 711                 __terminate__("Data error!");
 712             }
 713             ++i;
 714         }
 715         for(i=0;i!=(ctrl_type)vec.size();++i)l.build(vec.size()-1-i)=vec[i];
 716         del_zero();
 717         return *this;
 718     }
 719     integer& integer::operator=(const char* str)
 720         {return operator=(std::string(str));}
 721     integer& integer::operator=(const wchar_t* str)
 722         {return operator=(std::wstring(str));}
 723     decimal& decimal::operator=(const char* str)
 724         {return operator=(std::string(str));}
 725     decimal& decimal::operator=(const wchar_t* str)
 726         {return operator=(std::wstring(str));}
 727   template<typename __Tp>
 728     integer& integer::operator=(__Tp expr)
 729     {
 730         clear();
 731         if(is_character(expr))
 732         {
 733             l.build(0)=expr-48;
 734         }
 735         else if(is_integer(expr))
 736         {
 737             if(expr<0)expr=-expr,sign=1;
 738             unsigned long long temp=expr;
 739             if(temp==0)l.build(0)=0;
 740             while(temp)
 741             {
 742                 l.build(l.maxnum()+1)=temp%10;
 743                 temp/=10;
 744             }
 745         }
 746         else if(is_decimal(expr))
 747         {
 748             if(expr<0)expr=-expr,sign=1;
 749             unsigned long long temp=expr;
 750             if(temp==0)l.build(0)=0;
 751             while(temp)
 752             {
 753                 l.build(l.maxnum()+1)=temp%10;
 754                 temp/=10;
 755             }
 756         }
 757         else if(is_boolean(expr))
 758         {
 759             l.build(0)=expr==false?0:1;
 760         }
 761         del_zero();
 762         return *this;
 763     }
 764   template<typename __Tp>
 765     decimal& decimal::operator=(__Tp expr)
 766     {
 767         clear();
 768         if(is_character(expr))
 769         {
 770             l.build(0)=expr-48;
 771         }
 772         else if(is_integer(expr))
 773         {
 774             if(expr<0)expr=-expr,sign=1;
 775             unsigned long long temp=expr;
 776             if(temp==0)l.build(0)=0;
 777             while(temp)
 778             {
 779                 l.build(l.maxnum()+1)=temp%10;
 780                 temp/=10;
 781             }
 782         }
 783         else if(is_decimal(expr))
 784         {
 785             if(expr<0)expr=-expr,sign=1;
 786             unsigned long long temp=expr;
 787             if(temp==0)l.build(0)=0;
 788             expr-=temp;
 789             while(temp)
 790             {
 791                 l.build(l.maxnum()+1)=temp%10;
 792                 temp/=10;
 793             }
 794             while(expr)
 795             {
 796                 expr*=10;
 797                 temp=expr;
 798                 l.build(l.minnum()-1)=temp;
 799                 expr-=temp;
 800             }
 801         }
 802         else if(is_boolean(expr))
 803         {
 804             l.build(0)=expr==false?0:1;
 805         }
 806         del_zero();
 807         return *this;
 808     }
 809     bool operator<(const integer&a,const integer&b)
 810     {
 811         if(a.sign==0&&b.sign==1)return false;
 812         else if(a.sign==1&&b.sign==0)return true;
 813         else if(a.sign==0&&b.sign==0)
 814         {
 815             if(a.l.maxnum()>b.l.maxnum())return false;
 816             else if(a.l.maxnum()<b.l.maxnum())return true;
 817             for(integer::ctrl_type i=a.l.maxnum();i>=0;--i)
 818             {
 819                 if(a.l[i]<b.l[i])return true;
 820                 else if(a.l[i]>b.l[i])return false;
 821             }
 822             return false;
 823         }
 824         else {
 825             if(a.l.maxnum()>b.l.maxnum())return true;
 826             else if(a.l.maxnum()<b.l.maxnum())return false;
 827             for(integer::ctrl_type i=a.l.maxnum();i>=0;--i)
 828             {
 829                 if(a.l[i]<b.l[i])return false;
 830                 else if(a.l[i]>b.l[i])return true;
 831             }
 832             return false;
 833         }
 834     }
 835     bool operator==(const integer&a,const integer&b)
 836     {
 837         return a.sign==b.sign&&a.l.l==b.l.l;
 838     } 
 839     bool operator>(const integer&a,const integer&b)
 840     {
 841         return b<a;
 842     }
 843     bool operator<=(const integer&a,const integer&b)
 844     {
 845         return !(b<a);
 846     }
 847     bool operator>=(const integer&a,const integer&b)
 848     {
 849         return !(a<b);
 850     }
 851     bool operator!=(const integer&a,const integer&b)
 852     {
 853         return !(a==b);
 854     }
 855     
 856       bool operator<(const decimal&a,const decimal&b)
 857       {
 858         if(a.sign==0&&b.sign==1)return false;
 859         else if(a.sign==1&&b.sign==0)return true;
 860         else if(a.sign==0&&b.sign==0)
 861         {
 862             decimal::ctrl_type mini=
 863                 a.l.minnum()>b.l.minnum()?a.l.minnum():b.l.minnum();
 864             if(a.l.maxnum()>b.l.maxnum())return false;
 865             else if(a.l.maxnum()<b.l.maxnum())return true;
 866             for(decimal::ctrl_type i=a.l.maxnum();i>=0;--i)
 867             {
 868                 if(a.l[i]<b.l[i])return true;
 869                 else if(a.l[i]>b.l[i])return false;
 870             }
 871             for(decimal::ctrl_type i=-1;i>=mini;--i)
 872             {
 873                 if(a.l[i]<b.l[i])return true;
 874                 else if(a.l[i]>b.l[i])return false;
 875             }
 876             if(a.l.minnum()<mini)return false;
 877             if(b.l.minnum()<mini)return true;
 878             return false;
 879         }
 880         else {
 881             decimal::ctrl_type mini=
 882                 a.l.minnum()>b.l.minnum()?a.l.minnum():b.l.minnum();
 883             if(a.l.maxnum()>b.l.maxnum())return true;
 884             else if(a.l.maxnum()<b.l.maxnum())return false;
 885             for(decimal::ctrl_type i=a.l.maxnum();i>=0;--i)
 886             {
 887                 if(a.l[i]<b.l[i])return false;
 888                 else if(a.l[i]>b.l[i])return true;
 889             }
 890             for(decimal::ctrl_type i=-1;i>=mini;--i)
 891             {
 892                 if(a.l[i]<b.l[i])return false;
 893                 else if(a.l[i]>b.l[i])return true;
 894             }
 895             if(a.l.minnum()<mini)return true;
 896             if(b.l.minnum()<mini)return false;
 897             return false;
 898         }
 899     }
 900     bool operator==(const decimal&a,const decimal&b)
 901     {
 902         return a.sign==b.sign&&a.l.front==b.l.front&&a.l.back==b.l.back;
 903     }
 904     bool operator>(const decimal&a,const decimal&b)
 905     {
 906         return b<a;
 907     }
 908     bool operator<=(const decimal&a,const decimal&b)
 909     {
 910         return !(b<a);
 911     }
 912     bool operator>=(const decimal&a,const decimal&b)
 913     {
 914         return !(a<b);
 915     }
 916     bool operator!=(const decimal&a,const decimal&b)
 917     {
 918         return !(a==b);
 919     }
 920 #define OTHER_RELAT(SELF,OP)\
 921   template<typename __Tp>\
 922       bool operator OP(const SELF&self,const __Tp&other)\
 923       {\
 924           static SELF temp;\
 925           temp=other;\
 926           return self OP temp;\
 927     }
 928     OTHER_RELAT(integer,<)
 929     OTHER_RELAT(integer,==)
 930     OTHER_RELAT(integer,>)
 931     OTHER_RELAT(integer,<=)
 932     OTHER_RELAT(integer,>=)
 933     OTHER_RELAT(integer,!=)
 934     
 935     OTHER_RELAT(decimal,<)
 936     OTHER_RELAT(decimal,==)
 937     OTHER_RELAT(decimal,>)
 938     OTHER_RELAT(decimal,<=)
 939     OTHER_RELAT(decimal,>=)
 940     OTHER_RELAT(decimal,!=)
 941 #undef OTHER_RELAT
 942     std::ptrdiff_t max_dec_digit=6;
 943     integer operator+(const integer&a,const integer&b)
 944     {
 945         static integer res;
 946         res=0;
 947         if(a.sign==b.sign)
 948         {
 949             res.sign=a.sign;
 950             
 951             integer::ctrl_type stop_num=
 952                 a.l.maxnum()>b.l.maxnum()?b.l.maxnum():a.l.maxnum();
 953             res.l.build((a.l.maxnum()<b.l.maxnum()?b.l.maxnum():a.l.maxnum())+1);
 954             for(integer::ctrl_type i=0;i<=stop_num;++i)
 955             {
 956                 res.l[i]+=a.l[i]+b.l[i];
 957                 res.l[i+1]=res.l[i]/10;
 958                 res.l[i]%=10;
 959             }
 960             if(a.l.maxnum()>stop_num)
 961             {
 962                 res.build(a.l.maxnum()+1);
 963                 for(integer::ctrl_type i=stop_num+1;i<=a.l.maxnum();++i)
 964                 {
 965                     res.l[i]+=a.l[i];
 966                     res.l[i+1]=res.l[i]/10;
 967                     res.l[i]%=10;
 968                 }
 969             }
 970             if(b.l.maxnum()>stop_num)
 971             {
 972                 res.build(b.l.maxnum()+1);
 973                 for(integer::ctrl_type i=stop_num+1;i<=b.l.maxnum();++i)
 974                 {
 975                     res.l[i]+=b.l[i];
 976                     res.l[i+1]=res.l[i]/10;
 977                     res.l[i]%=10;
 978                 }
 979             }
 980             res.del_zero();
 981             return res;
 982         }
 983         else{
 984             if(a.sign)return b-a.abs();
 985             else return a-b.abs();
 986         }
 987     }
 988     integer operator-(const integer&a,const integer&b)
 989     {
 990         static integer res;
 991         res=0;
 992         if(a.sign==b.sign)
 993         {
 994             signed int buf=0; 
 995             if(a.abs()>b.abs())
 996             {
 997                 res.sign=a.sign;
 998                 integer::ctrl_type stop_num=b.l.maxnum();
 999                 res.l.build(stop_num+1);
1000                 for(integer::ctrl_type i=0;i<=stop_num;++i)
1001                 {
1002                     res.l[i]+=a.l[i]-b.l[i]+buf,buf=0;
1003                     if(res.l[i]<0)
1004                     buf-=1,res.l[i]+=10;
1005                 }
1006                 res.build(a.l.maxnum()+1);
1007                 for(integer::ctrl_type i=stop_num+1;i<=a.l.maxnum();++i)
1008                 {
1009                     res.l.build(i)+=a.l[i]+buf,buf=0;
1010                     if(res.l[i]<0)
1011                     buf-=1,res.l[i]+=10;
1012                 }
1013             }
1014             else 
1015             {
1016                 res.sign=!a.sign;
1017                 integer::ctrl_type stop_num=a.l.maxnum();
1018                 res.l.build(stop_num+1);
1019                 for(integer::ctrl_type i=0;i<=stop_num;++i)
1020                 {
1021                     res.l[i]+=b.l[i]-a.l[i]+buf,buf=0;
1022                     if(res.l[i]<0)
1023                     buf-=1,res.l[i]+=10;
1024                 }
1025                 res.build(b.l.maxnum()+1);
1026                 for(integer::ctrl_type i=stop_num+1;i<=b.l.maxnum();++i)
1027                 {
1028                     res.l.build(i)+=b.l[i]+buf,buf=0;
1029                     if(res.l[i]<0)
1030                     buf-=1,res.l[i]+=10;
1031                 }
1032             }
1033             res.del_zero();
1034             return res;
1035         }
1036         else{
1037             if(a.sign)return (a.abs()+b).oppo();
1038             else return (b.abs()+a);
1039         }
1040     } 
1041     integer operator*(const integer&a,const integer&b)
1042     {
1043         static integer res;
1044         res=0;
1045         res.sign=a.sign==b.sign?0:1;
1046         res.l.build(a.maxnum()+b.maxnum()+1);
1047         for(integer::ctrl_type i=0;i<=a.l.maxnum();++i)
1048         {
1049             for(integer::ctrl_type j=0;j<=b.l.maxnum();++j)
1050             {
1051                 res.l.build(i+j)+=a.l[i]*b.l[j];
1052                 res.l.build(i+j+1)+=res.l[i+j]/10;
1053                 res.l[i+j]%=10;
1054             }
1055         }
1056         res.del_zero();
1057         return res;
1058     }
1059     integer operator/(const integer&a,const integer&b)
1060     {
1061         static integer tempa;
1062         static integer tempb;
1063         static integer res;
1064         res=0;
1065         tempa=a;
1066         tempb=b;
1067         tempa.sign=false;
1068         tempb.sign=false;
1069         if(tempb==0)__terminate__("Divided by zero!");
1070         if(tempa==0)return res;
1071         if(tempa<tempb)return res;
1072         res.sign=a.sign==b.sign?0:1;
1073         integer::ctrl_type subsize=a.l.maxnum()-b.l.maxnum();
1074         res.l.build(subsize);
1075         tempb.move(tempa.l.maxnum()-tempb.l.maxnum());
1076         while(!(tempa<b.abs()))
1077         {    
1078             while(tempa>=tempb)tempa=tempa-tempb,res.l.build(subsize)=res.l.build(subsize)+1;
1079             --subsize;
1080             tempb.move(-1);
1081         }
1082         res.del_zero();
1083         return res;
1084     }
1085     integer operator%(const integer&a,const integer&b)
1086     {
1087         static integer res;
1088         res=a-a/b*b;
1089         return res;
1090     }
1091     
1092     decimal operator+(const decimal&a,const decimal&b)
1093     {
1094         static decimal res;
1095         res=0;
1096         if(a.sign==b.sign)
1097         {
1098             res.sign=a.sign;
1099             decimal::ctrl_type stop_num=
1100                 a.l.minnum()>b.l.minnum()?a.l.minnum():b.l.minnum();
1101             if(a.l.minnum()<b.l.minnum())
1102             {
1103                 int buf=0;
1104                 res.l.build(a.l.minnum());
1105                 for(decimal::ctrl_type i=a.l.minnum();i<b.l.minnum();++i)
1106                 res.l.build(i)=a.l[i];
1107                 for(decimal::ctrl_type i=b.l.minnum();i<0;++i)
1108                 {
1109                     res.l.build(i)=a.l[i]+b.l[i]+buf;
1110                     buf=res.l.build(i)/10;
1111                     res.l.build(i)%=10;
1112                 }
1113                 res.l.build(0)=buf; 
1114             }
1115             else {
1116                 int buf=0;
1117                 res.l.build(b.l.minnum());
1118                 for(decimal::ctrl_type i=b.l.minnum();i<a.l.minnum();++i)
1119                 res.l.build(i)=b.l[i];
1120                 for(decimal::ctrl_type i=a.l.minnum();i<0;++i)
1121                 {
1122                     res.l.build(i)=a.l[i]+b.l[i]+buf;
1123                     buf=res.l.build(i)/10;
1124                     res.l.build(i)%=10;
1125                 }
1126                 res.l.build(0)=buf; 
1127             }
1128             stop_num=a.l.maxnum()>b.l.maxnum()?b.l.maxnum():a.l.maxnum();
1129             res.l.build((a.l.maxnum()<b.l.maxnum()?b.l.maxnum():a.l.maxnum())+1);
1130             for(decimal::ctrl_type i=0;i<=stop_num;++i)
1131             {
1132                 res.l[i]+=a.l[i]+b.l[i];
1133                 res.l[i+1]=res.l[i]/10;
1134                 res.l[i]%=10;
1135             }
1136             if(a.l.maxnum()>stop_num)
1137             {
1138                 res.build(a.l.maxnum()+1);
1139                 for(decimal::ctrl_type i=stop_num+1;i<=a.l.maxnum();++i)
1140                 {
1141                     res.l[i]+=a.l[i];
1142                     res.l[i+1]=res.l[i]/10;
1143                     res.l[i]%=10;
1144                 }
1145             }
1146             if(b.l.maxnum()>stop_num)
1147             {
1148                 res.build(b.l.maxnum()+1);
1149                 for(decimal::ctrl_type i=stop_num+1;i<=b.l.maxnum();++i)
1150                 {
1151                     res.l[i]+=b.l[i];
1152                     res.l[i+1]=res.l[i]/10;
1153                     res.l[i]%=10;
1154                 }
1155             }
1156             res.del_zero();
1157             return res;
1158         }
1159         else{
1160             if(a.sign)return b-a.abs();
1161             else return a-b.abs();
1162         }
1163     }
1164     decimal operator-(const decimal&a,const decimal&b)
1165     {
1166         static decimal res;
1167         res=0;
1168         if(a.sign==b.sign)
1169         {
1170             signed int buf=0; 
1171             if(a.abs()>b.abs())
1172             {
1173                 res.sign=a.sign;
1174                 decimal::ctrl_type stop_num=a.l.minnum()>b.l.minnum()?a.l.minnum():b.l.minnum();
1175                 res.l.build(a.l.minnum()<b.l.minnum()?a.l.minnum():b.l.minnum()); 
1176                 if(b.l.minnum()<a.l.minnum())
1177                 {
1178                     for(decimal::ctrl_type i=b.l.minnum();i<a.l.minnum();++i)
1179                     {
1180                         res.l[i]=res.l[i]-b.l[i]+buf,buf=0;
1181                         if(res.l[i]<0)
1182                         buf-=1,res.l[i]+=10;
1183                     }
1184                     res.l.build(a.l.minnum())=buf;
1185                     buf=0;
1186                 }
1187                 else
1188                 {
1189                     for(decimal::ctrl_type i=a.l.minnum();i<b.l.minnum();++i)
1190                     {
1191                         res.l[i]=res.l[i]+a.l[i]+buf,buf=0;
1192                         if(res.l[i]<0)
1193                         buf-=1,res.l[i]+=10;
1194                     }
1195                     res.l.build(b.l.minnum())=buf;
1196                     buf=0;
1197                 }
1198                 for(decimal::ctrl_type i=stop_num;i<0;++i)
1199                 {
1200                     res.l[i]+=a.l[i]-b.l[i]+buf,buf=0;
1201                     if(res.l[i]<0)
1202                     buf-=1,res.l[i]+=10;
1203                 }
1204                 res.l.build(0)+=buf;
1205                 buf=0; 
1206                 stop_num=b.l.maxnum();
1207                 res.l.build(stop_num+1);
1208                 for(decimal::ctrl_type i=0;i<=stop_num;++i)
1209                 {
1210                     res.l[i]+=a.l[i]-b.l[i]+buf,buf=0;
1211                     if(res.l[i]<0)
1212                     buf-=1,res.l[i]+=10;
1213                 }
1214                 res.build(a.l.maxnum()+1);
1215                 for(decimal::ctrl_type i=stop_num+1;i<=a.l.maxnum();++i)
1216                 {
1217                     res.l.build(i)+=a.l[i]+buf,buf=0;
1218                     if(res.l[i]<0)
1219                     buf-=1,res.l[i]+=10;
1220                 }
1221             }
1222             else 
1223             {
1224                 res.sign=!a.sign;
1225                 decimal::ctrl_type stop_num=a.l.minnum()>b.l.minnum()?a.l.minnum():b.l.minnum();
1226                 res.l.build(a.l.minnum()<b.l.minnum()?a.l.minnum():b.l.minnum()); 
1227                 if(b.l.minnum()<a.l.minnum())
1228                 {
1229                     for(decimal::ctrl_type i=b.l.minnum();i<a.l.minnum();++i)
1230                     {
1231                         res.l[i]=res.l[i]-a.l[i]+buf,buf=0;
1232                         if(res.l[i]<0)
1233                         buf-=1,res.l[i]+=10;
1234                     }
1235                     res.l.build(a.l.minnum())=buf;
1236                     buf=0;
1237                 }
1238                 else
1239                 {
1240                     for(decimal::ctrl_type i=a.l.minnum();i<b.l.minnum();++i)
1241                     {
1242                         res.l[i]=res.l[i]+b.l[i]+buf,buf=0;
1243                         if(res.l[i]<0)
1244                         buf-=1,res.l[i]+=10;
1245                     }
1246                     res.l.build(b.l.minnum())=buf;
1247                     buf=0;
1248                 }
1249                 for(decimal::ctrl_type i=stop_num;i<0;++i)
1250                 {
1251                     res.l[i]+=b.l[i]-a.l[i]+buf,buf=0;
1252                     if(res.l[i]<0)
1253                     buf-=1,res.l[i]+=10;
1254                 }
1255                 res.l.build(0)+=buf;
1256                 buf=0; 
1257                 stop_num=a.l.maxnum();
1258                 res.l.build(stop_num+1);
1259                 for(decimal::ctrl_type i=0;i<=stop_num;++i)
1260                 {
1261                     res.l[i]+=b.l[i]-a.l[i]+buf,buf=0;
1262                     if(res.l[i]<0)
1263                     buf-=1,res.l[i]+=10;
1264                 }
1265                 res.build(b.l.maxnum()+1);
1266                 for(decimal::ctrl_type i=stop_num+1;i<=b.l.maxnum();++i)
1267                 {
1268                     res.l.build(i)+=b.l[i]+buf,buf=0;
1269                     if(res.l[i]<0)
1270                     buf-=1,res.l[i]+=10;
1271                 }
1272             }
1273             res.del_zero();
1274             return res;
1275         }
1276         else{
1277             if(a.sign)return (a.abs()+b).oppo();
1278             else return (b.abs()+a);
1279         }
1280     }
1281     decimal operator*(const decimal&a,const decimal&b)
1282     {
1283         static decimal res;
1284         res=0;
1285         res.sign=a.sign==b.sign?0:1;
1286         res.l.build(a.maxnum()+b.maxnum()+1);
1287         res.l.build(a.minnum()+b.minnum()-1);
1288         for(decimal::ctrl_type i=a.l.minnum();i<=a.l.maxnum();++i)
1289         {
1290             for(decimal::ctrl_type j=b.l.minnum();j<=b.l.maxnum();++j)
1291             {
1292                 res.l.build(i+j)+=a.l[i]*b.l[j];
1293                 res.l.build(i+j+1)+=res.l.build(i+j)/10;
1294                 res.l.build(i+j)%=10;
1295             }
1296         }
1297         res.del_zero();
1298         return res;
1299     } 
1300     decimal operator/(const decimal&a,const decimal&b)
1301     {
1302         static decimal tempa;
1303         static decimal tempb;
1304         static decimal res;
1305         res=0;
1306         tempa=a;
1307         tempb=b;
1308         tempa.sign=false;
1309         tempb.sign=false;
1310         if(tempb==0)__terminate__("Divided by zero!");
1311         if(tempa==0)return res;
1312         res.sign=a.sign==b.sign?0:1;
1313         decimal::ctrl_type subsize=a.l.maxnum()-b.l.maxnum();
1314         res.l.build(subsize);
1315         res.l.build(-max_dec_digit-1);
1316         tempb.move(tempa.l.maxnum()-tempb.l.maxnum());
1317         while(subsize>=-max_dec_digit)
1318         {    
1319             if(tempa==0)break;
1320             while(tempa>=tempb)tempa=tempa-tempb,
1321             res.l.build(subsize)=res.l.build(subsize)+1;
1322             --subsize;
1323             tempb.move(-1);
1324         }
1325         res.del_zero();
1326         return res;
1327     }
1328 #define OTHER_ARITH(SELF,OP)\
1329   template<typename __Tp>\
1330       SELF operator OP(const SELF&self,const __Tp&other)\
1331       {\
1332           return self OP SELF(other);\
1333     }
1334 #define ARITH_TYPE(SELF,OPE,OPC)\
1335       SELF& SELF::operator OPE(const SELF&other)\
1336       {\
1337           *this=*this OPC other;\
1338           return *this;\
1339     }
1340 #define OTHER_ARITH_TYPE(SELF,OPE,OPC)\
1341   template<typename __Tp>\
1342     SELF& operator OPE(SELF&t,const __Tp&other)\
1343       {\
1344           t=t OPC other;\
1345           return t;\
1346     }
1347 #define ADD_SUB(SELF)\
1348     SELF& SELF::operator ++()\
1349       {\
1350           *this=*this+1;\
1351           return *this;\
1352     }\
1353     SELF SELF::operator ++(int)\
1354       {\
1355           static SELF res;\
1356           res=*this;\
1357           ++*this;\
1358         return res;\
1359     }\
1360     SELF& SELF::operator --()\
1361       {\
1362           *this=*this-1;\
1363           return *this;\
1364     }\
1365     SELF SELF::operator --(int)\
1366       {\
1367           static SELF res;\
1368           res=*this;\
1369           --*this;\
1370         return res;\
1371     }
1372 #define POSI_NEGA(SELF)\
1373     SELF SELF::operator+()const{return *this;}\
1374     SELF SELF::operator-()const{return this->oppo();}
1375 #define ROTATE(SELF)\
1376     SELF operator>>(const SELF&t,const std::ptrdiff_t&s)\
1377     {\
1378         static SELF res;\
1379         res=t; \
1380         res.move(-s);\
1381         return res;\
1382     }\
1383     SELF operator<<(const SELF&t,const std::ptrdiff_t&s)\
1384     {\
1385         static SELF res;\
1386         res=t; \
1387         res.move(s);\
1388         return res;\
1389     }
1390 #define OTHER_ROTATE(SELF)\
1391     SELF& SELF::operator>>=(const std::ptrdiff_t&s)\
1392     {\
1393         move(-s);\
1394         return *this;\
1395     }\
1396     SELF& SELF::operator<<=(const std::ptrdiff_t&s)\
1397     {\
1398         move(s);\
1399         return *this;\
1400     }    
1401     OTHER_ARITH(integer,+)
1402     OTHER_ARITH(integer,-)
1403     OTHER_ARITH(integer,*)
1404     OTHER_ARITH(integer,/)
1405     OTHER_ARITH(integer,%)
1406     
1407     OTHER_ARITH(decimal,+)
1408     OTHER_ARITH(decimal,-)
1409     OTHER_ARITH(decimal,*)
1410     OTHER_ARITH(decimal,/)
1411 
1412     ARITH_TYPE(integer,+=,+)
1413     ARITH_TYPE(integer,-=,-)
1414     ARITH_TYPE(integer,*=,*)
1415     ARITH_TYPE(integer,/=,/)
1416     ARITH_TYPE(integer,%=,%)
1417     
1418     ARITH_TYPE(decimal,+=,+)
1419     ARITH_TYPE(decimal,-=,-)
1420     ARITH_TYPE(decimal,*=,*)
1421     ARITH_TYPE(decimal,/=,/)
1422 
1423     OTHER_ARITH_TYPE(integer,+=,+)
1424     OTHER_ARITH_TYPE(integer,-=,-)
1425     OTHER_ARITH_TYPE(integer,*=,*)
1426     OTHER_ARITH_TYPE(integer,/=,/)
1427     OTHER_ARITH_TYPE(integer,%=,%)
1428     
1429     OTHER_ARITH_TYPE(decimal,+=,+)
1430     OTHER_ARITH_TYPE(decimal,-=,-)
1431     OTHER_ARITH_TYPE(decimal,*=,*)
1432     OTHER_ARITH_TYPE(decimal,/=,/)
1433 
1434     ADD_SUB(integer)
1435     ADD_SUB(decimal)
1436 
1437     POSI_NEGA(integer)
1438     POSI_NEGA(decimal)
1439 
1440     ROTATE(integer)
1441     ROTATE(decimal)
1442 
1443     OTHER_ROTATE(integer)
1444     OTHER_ROTATE(decimal)
1445 #undef OTHER_ARITH
1446 #undef OTHER_ARITH_TYPE
1447 #undef ARITH_TYPE
1448 #undef ADD_SUB
1449 #undef POSI_NEGA
1450 #undef ROTATE
1451 #undef OTHER_ROTATE
1452     std::istream&operator>>(std::istream&s,integer&t)
1453     {
1454         t.get();
1455         return s;
1456     }
1457     std::ostream&operator<<(std::ostream&s,const integer&t)
1458     {
1459         t.put();
1460         return s;
1461     }
1462     std::istream&operator>>(std::istream&s,decimal&t)
1463     {
1464         t.get();
1465         return s;
1466     }
1467     std::ostream&operator<<(std::ostream&s,const decimal&t)
1468     {
1469         t.put();
1470         return s;
1471     }
1472       integer pow(integer x,size_t y)
1473       {
1474           integer res=1;
1475         while(y)
1476         {
1477             if(y&1)res=res*x;
1478             if(y>>=1)x*=x;
1479         }
1480         return res;
1481     }
1482     decimal pow(decimal x,size_t y)
1483       {
1484           decimal res=1;
1485         while(y)
1486         {
1487             if(y&1)res=res*x;
1488             if(y>>=1)x*=x;
1489         }
1490         return res;
1491     }
1492     integer sqrt(const integer&x)
1493     {
1494         static integer left;
1495         static integer right;
1496         static integer middle;
1497         if(x<0)
1498         {
1499             printf("The number is less than zero!\n");
1500             exit(-1);
1501         }
1502         left=0;
1503         right=x;
1504         middle=(left+right)/2;
1505         while((right-left)>1)
1506         {
1507             middle=(left+right)/2;
1508             const decimal&y=middle*middle;
1509             if(y<x)left=middle;
1510             else if(y>x)right=middle;
1511             else return middle;    
1512         }
1513         return middle;
1514     }
1515     decimal sqrt(const decimal&x)
1516     {
1517         static decimal left;
1518         static decimal right;
1519         static decimal middle;
1520         static decimal temp;
1521         if(x<0)
1522         {
1523             printf("The number is less than zero!\n");
1524             exit(-1);
1525         }
1526         left=0;
1527         middle=right=x<1?1:x;
1528         do
1529         {
1530             //std::cout<<"left="<<left<<" "<<"right="<<right<<" "<<"middle="<<middle<<" square="<<middle*middle<<" x="<<x<<std::endl;
1531             if(middle*middle<x)left=middle;
1532             else if(middle*middle>x)right=middle;
1533             else return middle;
1534             temp=(left+right)/2;
1535             if(middle==temp)break;
1536             middle=temp;
1537         }while(middle.mininum()>=-max_dec_digit);
1538         return middle;
1539     }
1540     integer gcd(integer x,integer y);
1541     integer lcm(integer x,integer y);
1542 #undef __terminate__
1543 }

 

解说敬请期待!!

 

转载于:https://www.cnblogs.com/ColinWang-OIer/p/11248660.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值