永发信息网

c++题目 大数减法

答案:1  悬赏:0  手机版
解决时间 2021-02-27 12:53
c++题目 大数减法
最佳答案
#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();

}


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
临沂哪有寺院之类的,可以出家的地方啊?
滨西佳园南区地址在什么地方,想过去办事
美图手机哪款最好用
125期: 将100颗绿豆和100颗黄豆混在一起又一
求三彼女百度云资源。免费的。
图片中关羽在“刮骨疗毒”中,不可能出现的是
恶魔法则 安琪儿
下列物质能使干燥KI淀粉试纸变蓝的是A.干燥氯
想买个固态硬盘用来当移动硬盘可行吗
我爱你各国语言怎么说
我在韩国带回一个三星的路由器,请问怎么使用
家庭装小型断路器如何选择安倍数 例如25A或者
在网上买了条爆珠健牌的烟,是越南那边产的,
机械加工的工艺流程卡?
word水印大小可以调整吗?
推荐资讯
为什么,为什么所有的不幸全部都发生在我身上
男生卷发大背头怎么打理
北京镶一颗全瓷牙的价格,想要去做一颗修补一
怎么计算气体的摩尔质量?怎么计算?还有,比如C
宏字在五行属什么
鼻尖长痣好不好
借工资的借条怎么写
-0.7取整数为-1、0.5取整为什么是0?
赛睿apex m500 怎么拔键帽
现在流行什么裤子
我国工业的空间分布?
北京有什么卖大号西装的地方
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?