永发信息网

c++题目 大数减法

答案:1  悬赏:0  手机版
解决时间 2021-02-27 12:53
  • 提问者网友:眉目添风霜
  • 2021-02-27 05:27
c++题目 大数减法
最佳答案
  • 五星知识达人网友:七十二街
  • 2021-02-27 06:07
#include 
#include 

const size_t MAX = 100;

class array_t {
private:
int8_t _sign;
int8_t* _res;
size_t _len;

// array_t() {};
public:
array_t ( int8_t val, size_t len, int8_t sign ): _sign(sign) {
_len = ( len > MAX ? MAX : len ) + 1;

_res = new int8_t [_len];

for ( char i=0; i<_len-1; ++i ) {
_res[i] = val;
}

_res[_len-1] = _sign;
}

array_t ( const array_t& ary_2 ) {
_len = ary_2._len;
_sign = ary_2._sign;
_res = new int8_t [_len];
for ( char i=0; i<_len-1; ++i ) {
_res[i] = ary_2._res[i];
}
}

void prt () {
if ( _res[0] == 0 && _len == 2 ) { printf( " " ); }
else {
printf( "%c",  _res[_len-1] == 1 ? '-' : '+' );
}

for ( char i=_len-2; i>-1; --i ) {
if ( i == _len-2 && i != 0 && (*this)[i] == 0 ) continue;
if ( i < _len-2 && (*this)[i+1] == 0 && (*this)[i] == 0 ) continue;
printf( "%d", _res[i] );
} printf( "
" );
}

int8_t& operator[] ( const int8_t pos ) {
return ( pos < this->_len - 1 ? this->_res[pos] : this->_res[MAX-1] );
}

bool operator> ( const array_t& ary_2 ) {
if ( this->_sign == 0 && ary_2._sign == 1 ) { return true; }
else if ( this->_sign == 0 && ary_2._sign == 0 ) {
if ( this->_len > ary_2._len ) return true;
if ( this->_len == ary_2._len ) {
int8_t i = this->_len-1;
while (  --i > -1 ) {
if ( this->_res[i] > ary_2._res[i] ) return true;
}
}
}
else if ( this->_sign == 1 && ary_2._sign == 1 ) {
if ( this->_len < ary_2._len ) return true;
if ( this->_len == ary_2._len ) {
int8_t i = this->_len-1;
while (  --i > -1 ) {
if ( this->_res[i] < ary_2._res[i] ) return true;
}
}
}
return false;
}

bool operator== ( const array_t& ary_2 ) {
if ( this->_len == ary_2._len ) {
for ( char i=0; i_len; ++i ) {
if ( this->_res[i] != ary_2._res[i] ) return false;
}
return true;
}
return false;
}

bool operator< ( const array_t& ary_2 ) {
return ( !(*this > ary_2) && !(*this == ary_2) );
}

array_t operator- ( const array_t& ary_2 ) {

if ( *this == ary_2 ) { return array_t( 0, 1, 0 ); }

size_t max = ( this->_len > ary_2._len ? this->_len : ary_2._len );
size_t min = ( this->_len < ary_2._len ? this->_len : ary_2._len );

int8_t itm = -1;
int8_t lss = ( this->_res[this->_len-1] == 1 ? -1 : 1 );
int8_t rss = ( ary_2._res[ary_2._len-1] == 1 ? -1 : 1 );

if ( *this > ary_2 ) {
array_t Ans( 0, max, 0 );

while ( ++itm < min-1 ) {
Ans[itm] += lss*this->_res[itm] - rss*ary_2._res[itm];
if ( Ans[itm] <  0 ) { Ans[itm]+=10; Ans[itm+1]--; }
if ( Ans[itm] > 10 ) { Ans[itm]-=10; Ans[itm+1]++; }
}

if ( this->_len > ary_2._len ) {
do {
Ans[itm] += lss*this->_res[itm];
} while ( ++itm < max-1 );
} else if ( this->_len < ary_2._len ) {
do {
Ans[itm] -= rss*ary_2._res[itm];
} while ( ++itm < max-1 );
}

return Ans;

} else {
array_t Ans( 0, max, 1 );

while ( ++itm < min-1 ) {
Ans[itm] +=  rss*ary_2._res[itm] - lss*this->_res[itm];
if ( Ans[itm] <  0 ) { Ans[itm]+=10; Ans[itm+1]--; }
if ( Ans[itm] > 10 ) { Ans[itm]-=10; Ans[itm+1]++; }
}

if ( this->_len > ary_2._len ) {
do {
Ans[itm] -= lss*this->_res[itm];
} while ( ++itm < max-1 );
} else if ( this->_len < ary_2._len ) {
do {
Ans[itm] += rss*ary_2._res[itm];
} while ( ++itm < max-1 );
}

return Ans;
}

}

virtual ~array_t () { delete [] _res; }

};

int main(int argc, char *argv[]) {

array_t ary( 3, 99, 0 );
// ary[0] = 2;

array_t ary2( 2, 99, 1 );

ary.prt();
ary2.prt();

array_t ans = ary - ary2;
ans.prt();

}


我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯