/*
* Bigint.cc
* (C) Porkolab Zoltan, ELTE, Budapest, Hungary
* (C) 1998
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include "bigint"
Bigint::Bigint( const char *s)
{
size = strlen( s );
init( s );
}
Bigint::Bigint( const Bigint &rhs)
{
size = rhs.size;
init( rhs.v );
}
Bigint::~Bigint()
{
}
Bigint &Bigint::operator=( const Bigint &rhs)
{
if ( &rhs != this )
{
delete [] v;
size = rhs.size;
init( rhs.v );
}
return *this;
}
Bigint &Bigint::operator++()
{
for ( int i = size-1; i >= 0; --i )
{
++v[i];
if ( v[i] == '9'+1 )
v[i] = '0';
else
break;
}
if ( v[0] == '0' )
{
char *p = new char[size+1];
p[0] = '1';
memcpy( p+1, v, size);
++size;
delete [] v;
v = p;
}
return *this;
}
int Bigint::get_digit( int i) const
{
assert( i > 0 && i <= size );
return v[size-i]-'0';
}
int Bigint::operator[]( int i) const
{
return get_digit( i );
}
double Bigint::get_value() const
{
assert( size < 10 );
double val = v[0]-'0';
for ( int i = 1; i < size ; ++i )
{
val *= 10;
val += v[i]-'0';
}
return val;
}
Bigint::operator double() const
{
return get_value();
}
int Bigint::mark_five( int arg )
{
return 1;
}
void Bigint::init( const char *s)
{
v = new char[size];
for ( int i = 0; i < size; ++i )
v[i] = s[i];
}
ostream& operator<<( ostream& os, const Bigint &bi)
{
for ( int i = 0; i < bi.size; ++i )
os << bi.v[i];
return os;
}