C++大整數模板
阿新 • • 發佈:2019-01-09
#define MAXN 9999 #define DLEN 4 class Bignum { private: int a[10010],len; public: Bignum(){ len=1; memset( a , 0 , sizeof(a) ); } Bignum( const int ); Bignum( const char* ); Bignum &operator=( const Bignum & ); Bignum operator+( const Bignum & )const; Bignum operator-( const Bignum & )const; Bignum operator*( const Bignum & )const; Bignum operator/( const int & )const; Bignum operator^( const int & )const; int operator%( const int & )const; bool operator>( const Bignum&T )const; bool operator>( const int &t )const; void print(); }; Bignum::Bignum( const int b ) { int c,d=b; len = 0; memset ( a , 0 , sizeof(a) ); while ( d>MAXN ) { c = d-(d/(MAXN+1))*(MAXN+1); d = d/(MAXN+1); a[len++] = c; } a[len++] = d; } Bignum::Bignum( const char*s ) { memset ( a , 0 , sizeof(a) ); int L = strlen(s); len = L/DLEN; if ( L%DLEN ) len++; int index = 0; for( int i=L-1 ; i>=0 ; i-=DLEN ) { int t = 0; int k = i-DLEN+1; if ( k<0 ) k = 0; for ( int j=k ; j<=i ; j++ ) t = t*10+s[j]-'0'; a[index++] = t; } } Bignum & Bignum::operator=( const Bignum &n ) { len = n.len; memset ( a , 0 , sizeof(a) ); for ( int i=0 ; i<len ; i++ ) a[i] = n.a[i]; return *this; } Bignum Bignum::operator+( const Bignum &T )const { Bignum t(*this); int big = T.len>len?T.len:len; for ( int i=0 ; i<big ; i++ ) { t.a[i] += T.a[i]; if ( t.a[i]>MAXN ) { t.a[i+1]++; t.a[i] -= MAXN+1; } } if ( t.a[big]!=0 ) t.len = big+1; else t.len = big; return t; } Bignum Bignum::operator-( const Bignum &T )const { bool flag; Bignum t1,t2; if ( *this>T ) { t1 = *this; t2 = T; flag = 0; } else { t1 = T; t2 = *this; flag = 1; } int big = t1.len; for ( int i=0 ; i<big ; i++ ) { if ( t1.a[i]<t2.a[i] ) { int j = i+1; while ( t1.a[j]==0 ) j++; t1.a[j--]--; while ( j>i ) t1.a[j--] += MAXN; t1.a[i] += MAXN+1-t2.a[i]; } else t1.a[i] -= t2.a[i]; } t1.len = big; while ( t1.a[t1.len-1]==0&&t1.len>1 ) t1.len--; if ( flag ) t1.a[t1.len-1] = 0-t1.a[t1.len-1]; return t1; } Bignum Bignum::operator*( const Bignum&T )const { Bignum ret; int i,j,up; int temp,temp1; for ( i=0 ; i<len ; i++ ) { up = 0; for ( j=0 ; j<T.len ; j++ ) { temp = a[i]*T.a[j]+ret.a[i+j]+up; if( temp>MAXN ) { temp1 = temp-temp/(MAXN+1)*(MAXN+1); up = temp/(MAXN+1); ret.a[i+j] = temp1; } else { up = 0; ret.a[i+j] = temp; } } if ( up!=0 ) ret.a[i+j] = up; } ret.len = i+j; while ( ret.a[ret.len-1]==0&&ret.len>1 ) ret.len--; return ret; } Bignum Bignum::operator/( const int &b )const { Bignum ret; int down=0; for ( int i=len-1 ; i>=0 ; i-- ) { ret.a[i] = (a[i]+down*(MAXN+1))/b; down = a[i]+down*(MAXN+1)-ret.a[i]*b; } ret.len = len; while ( ret.a[ret.len-1]==0&&ret.len>1 ) ret.len--; return ret; } int Bignum::operator%( const int &b )const { int d = 0; for ( int i=len-1 ; i>=0 ; i-- ) d = ( (1LL*d*(MAXN+1))%b+a[i] )%b; return d; } Bignum Bignum::operator^( const int &n )const { Bignum t,ret(1); if ( n<0 ) exit(-1); if ( n==0 ) return 1; if ( n==1 ) return *this; int m = n,i; while ( m>1 ) { t = *this; for ( i=1 ; (i<<1)<=m ; i<<=1 ) t = t*t; m -= i; ret = ret*t; if ( m==1 ) ret = ret*(*this); } return ret; } bool Bignum::operator>( const Bignum &T )const { int ln; if ( len>T.len ) return true; else if ( len==T.len ) { ln = len-1; while ( a[ln]==T.a[ln]&&ln>=0 ) ln--; if ( ln>=0&&a[ln]>T.a[ln] ) return true; else return false; } else return false; } bool Bignum::operator>( const int &t )const { Bignum b(t); return *this>b; } void Bignum::print() { int i; printf( "%d" , a[len-1] ); for ( int i=len-2 ; i>=0 ; i-- ) printf( "%04d" , a[i] ); printf( "\n" ); }