花了一天时间写的一个很挫很挫的大数模板

花了一天时间写的一个很挫很挫的大数模板
这就
#include  " iostream "
#include 
" stdio.h "
#define  Mod 10000
using   namespace  std;
int  ku[]  =  { 1 , 10 , 100 , 1000 , 10000 };
class  BigNum {
private :
    
int  data[ 10000 ];
    
bool  flag;
    
int  len;
public :
    BigNum(){len 
=   1 ;flag  =   false ;data[ 0 =   0 ;}
    
~ BigNum(){}
    BigNum(
int  x) {
        
if (x  <   0 ) {x  =   -  x;flag  =   true ;}
        
else {flag  =   false ;}
        len 
=   0 ;
        
if (x  ==   0 )data[len  ++ =  x;
        
while (x) {data[len ++ =  x  %  Mod;x  /=  Mod;}
    }
    BigNum(
char  x[]) {
        
int  end,l,cnt;
        
if (x[ 0 ==   ' - ' ) {end  =   1 ;flag  =   true ;} 
        
else  {end  =   0 ;flag  =   false ;}
        l 
=  strlen(x);cnt  =   3 ;len  =   - 1 ;
        
for (l  --  ; l  >=  end; l  -- )
            
if (cnt  ==   3 ) {cnt  =   0 ;data[ ++ len]  =  x[l]  -   ' 0 ' ;} 
            
else  {cnt  ++ ;data[len]  =  data[len]  +  (x[l]  -   ' 0 ' *  ku[cnt];}
        len 
++ ;
    }
    
void  Scanf( int  x) {
        
if (x  <   0 ) {x  =   -  x;flag  =   true ;} 
        
else  flag  =   false ;
        len 
=   0 ;
        
if (x  ==   0 )data[len  ++ =  x;
        
while (x) {data[len ++ =  x  %  Mod;x  /=  Mod;}        
    }
    
void  Scanf( char  x[]) {
        
int  end,l,cnt;
        
if (x[ 0 ==   ' - ' ) {end  =   1 ;flag  =   true ;}
        
else  {end  =   0 ;flag  =   false ;}
        l 
=  strlen(x);cnt  =   3 ;len  =   - 1 ;
        
for (l  --  ; l  >=  end; l  -- )
            
if (cnt  ==   3 ) {cnt  =   0 ;data[ ++ len]  =  x[l]  -   ' 0 ' ;} 
            
else  {cnt  ++ ;data[len]  =  data[len]  +  (x[l]  -   ' 0 ' *  ku[cnt];}
        len 
++ ;
    }
    
void  ChangeSymbol() { if (flag)flag  =   false ; else  flag  =   true ;}
    
bool  Zero(){ return  (len  ==   1   &&  data[ 0 ==   0 );}
    friend 
bool   operator   ==  (BigNum  &  a, BigNum  & b) {
        
if (a.len  !=  b.len  ||  a.flag  !=  b.flag) return   false ;
        
for ( int  i  =   0 ; i  < a.len; i  ++ if (a.data[i]  !=  b.data[i]) return   false ;
        
return   true ;
    }
    friend 
bool   operator   ==  (BigNum  &  a, int   &  b) {BigNum c(b); return  a  ==  c;}
    friend 
bool   operator   >  (BigNum  &  a,BigNum  &  b) {
        
if ( ! a.flag  &&  b.flag) return   true ;
        
if (a.flag  &&   ! b.flag) return   false ;
        
if ( ! a.flag  &&   ! b.flag) {
            
if (a.len  >  b.len) return   true ;
            
if (a.len  <  b.len) return   false ;
            
for ( int  i  =  a.len  -   1 ; i  >=   0  ; i  -- )
                
if (a.data[i]  >  b.data[i]) return   true ;
                
else   if (a.data[i]  <  b.data[i]) return   false ;
            
return   false ;
        }
        
if (a.len  >  b.len) return   false ;
        
if (a.len  <  b.len) return   true ;
        
for ( int  i  =  a.len  -   1 ; i  >=   0  ; i  -- )
            
if (a.data[i]  >  b.data[i]) return   false ;
            
else   if (a.data[i]  <  b.data[i]) return   true ;
        
return   false ;
    }
    friend 
bool   operator   <  (BigNum  &  a,BigNum  &  b) { return   ! (a  >  b)  &&   ! (a  ==  b);}
    friend 
bool   operator   >=  (BigNum  &  a,BigNum  &  b) { return  (a  >  b)  ||  (a  ==  b);}
    friend 
bool   operator   <=  (BigNum  &  a,BigNum  & b) { return  (a  <  b)  ||  (a  ==  b);}
    friend BigNum 
operator   +  (BigNum  &  a, BigNum  & b) {
        BigNum c;
int  i;
        
if (a.flag  ==  b.flag) {
            c.flag 
=  a.flag;
            
for (i  =   0  ; i  <  b.len  &&  i  <  a.len; i  ++ ) c.data[i]  =  a.data[i]  +  b.data[i];
            
for ( ; i  <  a.len ; i  ++ ) c.data[i]  =  a.data[i];
            
for ( ; i  <  b.len ; i  ++ ) c.data[i]  =  b.data[i];
            
for (c.len  =  i , i  =   0 ; i  <  c.len  -   1 ; i  ++ ) { if (c.data[i]  >=  Mod) {c.data[i]  -=  Mod;c.data[i + 1 +=  i;}}
            
if (c.data[i]  >=  Mod) {c.data[i]  -=  Mod;c.data[i  +   1 =   1 ;c.len  ++ ;}
        } 
else  {
            BigNum buf;
            
if (a.flag) {a.ChangeSymbol(); if (a  >  b) {c  =  a;c.flag  =   true ;buf  =  b;} 
                
else   if (a  <  b){c  =  b;c.flag  =   false ;buf  =  a;}  else  {a.ChangeSymbol();c.len  =   1 ;
                c.data[
0 =   0 ;c.flag  =   false ; return  c;}a.ChangeSymbol();} 
            
else  {b.ChangeSymbol(); if (a  >  b) {c  =  a;c.flag  =   false ;buf  =  b;}
                
else   if  (a  <  b){c  =  b;c.flag  =   true ;buf  =  a;}  else  {b.ChangeSymbol();c.len  =   1 ;
                c.data[
0 =   0 ;c.flag  =   false ; return  c;}b.ChangeSymbol();}
            
for (i  =   0 ;i  <  buf.len; i  ++ ) {c.data[i]  -=  buf.data[i]; if (c.data[i]  <   0 ) {c.data[i]  +=  Mod;c.data[i + 1 -- ;}}
            
for (i  =  c.len  -   1 ; i  >=   0  ; i  -- if (c.data[i]) break ;
            c.len 
=  i  +   1 ;
        }
        
return  c;
    }
    friend BigNum 
operator   +  (BigNum  &  a,  int   &  b) {BigNum c(b); return  a  +  c;}
    friend BigNum 
operator   -  (BigNum  &  a,BigNum  &  b) {b.ChangeSymbol();BigNum c  =  a  +  b;b.ChangeSymbol(); return  c;}
    friend BigNum 
operator   -  (BigNum  &  a,  int   &  b) {BigNum c(b); return  a  -  c;}
    friend BigNum 
operator   *  (BigNum  &  a,BigNum  &  b) {
        BigNum c;
        
if (a.Zero()  ||  b.Zero()) return  c;
        
if (a.flag  ==  b.flag)c.flag  =   false ;
        
else  c.flag  =   true ;
        c.len 
=  a.len  +  b.len;
        memset(c.data,
0 , sizeof ( int ) * (c.len));
        
for ( int  i  =   0 ; i  <  a.len; i  ++ )
            
for ( int  j  =   0 ; j  <  b.len; j  ++ ) { int  k  =  i  +  j;c.data[k]  +=  a.data[i]  *  b.data[j];c.data[k + 1 +=  c.data[k]  /  Mod;c.data[k]  %=  Mod;}
        
if (c.data[c.len - 1 ==   0 )c.len  -- ;
        
return  c;
    }
    friend BigNum 
operator   *  (BigNum  &  a,  int   &  b) {BigNum c(b); return  a  *  c;}
    friend 
int   operator   %  (BigNum  &  a,  int   &  b) { long   long  buf  =   0 ; for ( int  i  =  a.len  -   1 ; i  >=   0 ; i  -- ) {buf  =  (buf  *  Mod  +  a.data[i]) % b;} return  buf;}
    friend BigNum 
operator   /  (BigNum  &  a, int   &  b) {
        
long   long  buf  =   0 ; int  i; for (i  =  a.len  -   1 ; i  >=   0 ; i  -- ) {buf  =  buf  *  Mod  +  a.data[i]; if (buf  >=  b) break ;}a.len  =  i  +   1 ;a.data[i]  =  buf  /  b;buf  %=  b;
        
for (i  --  ; i  >=   0  ; i  -- ) {buf  =  buf  *  Mod  +  a.data[i];a.data[i]  =  buf  /  b;buf  =  buf  %  b;} return  a;
    }
    
void  Printf() { if (flag)printf( " - " );printf( " %d " ,data[len - 1 ]); for ( int  i  =  len  -   2 ; i  >=   0  ; i  -- )printf( " %04d " ,data[i]);puts( "" );}
};
int  main() {
    BigNum num[
101 ];
    
int  n;
    num[
0 ].Scanf( 1 );
    
for ( int  n  =   0 ;n  <   1 ;n  ++ ) {
        
int  buf  =   4   *  n  +   2 ;
        num[n
+ 1 =  num[n]  *  buf;
        buf 
=  n  +   2 ;
        num[n
+ 1 =  num[n + 1 /  buf;
    }
    
while (scanf( " %d " , & n)  ==   1 ) {
        num[n].Printf();
    }
    
return   0 ;
}

你可能感兴趣的:(花了一天时间写的一个很挫很挫的大数模板)