加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

补码表示的大数加减乘除运算程序设计

发布时间:2020-12-14 02:52:06 所属栏目:大数据 来源:网络整理
导读:#include ? deque vector iostream string algorithm using ? namespace ?std; class ?DividedByZeroException{}; ?BigInteger { private : ?????vector char digits;? ????? bool ?sign;?????????? // ??true for positive,false for negitive void ?trim()
#include ? <deque>
<vector>
<iostream>
<string>
<algorithm>
using ? namespace ?std;

class ?DividedByZeroException{};
?BigInteger
{
private :
?????vector< char > digits;?
????? bool ?sign;?????????? // ??true for positive,false for negitive
void ?trim();???????? ??remove zeros in tail,but if the value is 0,keep only one:)
public ?????BigInteger( int );???? ?construct with a int integer string &) ;
?????BigInteger();
?????BigInteger ( const ?BigInteger&);
?????BigInteger? operator =( ?BigInteger& op2);
?????BigInteger??????abs()? ;
?????BigInteger??? pow( ?a);
????? binary operators ????????
friend ?BigInteger? +=(BigInteger&, -=(BigInteger&,Monaco">*=(BigInteger&,Monaco">/=(BigInteger&,Monaco">?BigInteger&)? throw (DividedByZeroException);
%=(BigInteger&,Monaco">(DividedByZeroException);???????
+( ?BigInteger&,Monaco">-( *( /( %( ???
uniary operators ?BigInteger&);??? negative

++(BigInteger&);???????? ++v ++(BigInteger&,Monaco">v++ --(BigInteger&);???????? --v --(BigInteger&,Monaco">v-- >( <( ==( !=( >=( <=( ?ostream&? <<(ostream&,Monaco">?BigInteger&);???? print the BigInteger ?istream&? >>(istream&,BigInteger&);????????? ?input the BigInteger static ?BigInteger ZERO;
?BigInteger ONE;
?BigInteger TEN;
};
?BigInteger BigInteger::ZERO=BigInteger( 0 );
?BigInteger BigInteger::ONE =BigInteger( 1 ?BigInteger BigInteger::TEN =BigInteger( 10 BigInteger::BigInteger()
??? sign= true ;?
}
BigInteger::BigInteger( ?val){ ???? if ?(val >=? )
????????sign =? else false ????????val *= (- ??? }
do ????????digits.push_back( ( )(val% ) );
????????val /=? ??? }? while ?( val !=? ?);
& def){
for ?(? ::reverse_iterator iter = def.rbegin() ; iter < def.rend();??iter++){
???????? ?ch = (*iter);
?(iter == def.rend()- ){
???????????? ?( ch ==? ' + ' ?)
???????????????? break (ch ==? - ?){
??????????????? sign =? ????????????}
????????}
)((*iter) -? 0 ?) );
??? trim();
?BigInteger::trim(){
??? vector< >::reverse_iterator iter = digits.rbegin();
(!digits.empty() && (*iter) ==? ????????digits.pop_back();
????????iter=digits.rbegin();
( digits.size()== ????????digits.push_back( ?BigInteger& op2){
??? sign = op2.sign;
??? digits=op2.digits;
BigInteger BigInteger:: ??? digits = op2.digits;
return ?(* this BigInteger BigInteger::abs()? ?{
(sign)?? ?* ?????? ?-(* BigInteger BigInteger::pow( ?a)?
??? BigInteger res( ( ?i= ; i<a; i++)
????????res*=(* ?res;
BigInteger? +=(BigInteger& op1,Monaco">( op1.sign == op2.sign ){????? 只处理相同的符号的情况,异号的情况给-处理 ????????vector< >::iterator iter1;
>::const_iterator iter2;
????????iter1 = op1.digits.begin();
????????iter2 = op2.digits.begin();
?to_add =? ;???????? 进位 ?( iter1 != op1.digits.end() && iter2 != op2.digits.end()){
????????????(*iter1) = (*iter1) + (*iter2) + to_add;
????????????to_add = ((*iter1) >? 9 ?大于9进一位 ????????????(*iter1) = (*iter1) %? ????????????iter1++; iter2++;
?( iter1 != op1.digits.end() ){??? ? ????????????(*iter1) = (*iter1) + to_add;
????????????to_add = ( (*iter1) >? ????????????(*iter1) %=? ????????????iter1++;
?( iter2 != op2.digits.end() ){
?val = (*iter2) + to_add;
????????????to_add = (val >? ) ;
????????????val %=? ????????????op1.digits.push_back(val);
????????????iter2++;
( to_add !=? ????????????op1.digits.push_back(to_add);
?op1;
?(op1.sign)
?op1 -= (-op2);
else
?op1= op2 - (-op1);
-=(BigInteger& op1,Monaco">( op1.sign == op2.sign ){
(op1.sign) {?
(op1 < op2)
??op1=-(op2 - op1);
????????}?
(-op1 > -op2)?
?op1=-((-op1)-(-op2));
????????????
?op1= (-op2) - (-op1);
?to_substract =? ;??
????????????(*iter1) = (*iter1) - (*iter2) - to_substract;
????????????to_substract =? ( (*iter1) <? ??????????????? to_substract= ??????????????? (*iter1) +=? ?( iter1 != op1.digits.end() ){
????????????(*iter1) = (*iter1) - to_substract;
????????op1.trim();
?(op1 > BigInteger::ZERO)
?op1 += (-op2);
?op1 = -(op2 + (-op1));
*=(BigInteger& op1,Monaco">??? BigInteger result( ?(op1 == BigInteger::ZERO || op2==BigInteger::ZERO)
????????result = BigInteger::ZERO;
>::const_iterator iter2 = op2.digits.begin();
( iter2 != op2.digits.end() ){
(*iter2 !=? ??????????????? deque< > temp(op1.digits.begin(),op1.digits.end());
>::iterator iter1 = temp.begin();
( iter1 != temp.end() ){
????????????????????(*iter1) *= (*iter2);
????????????????????(*iter1) += to_add;
????????????????????to_add = (*iter1) /? ????????????????????(*iter1) %=? ????????????????????iter1++;
??????????????? }
????????????????????temp.push_back( to_add );
?num_of_zeros = iter2 - op2.digits.begin();
(??num_of_zeros--)
????????????????????temp.push_front( ??????????????? BigInteger temp2;
??????????????? temp2.digits.insert( temp2.digits.end(),temp.begin(),temp.end() );
??????????????? temp2.trim();
??????????????? result = result + temp2;
????????result.sign = ( (op1.sign && op2.sign) || (!op1.sign && !op2.sign) );
??? op1 = result;
/=(BigInteger& op1,? ?BigInteger& op2 )? (DividedByZeroException) {
( op2 == BigInteger::ZERO )
?DividedByZeroException();
??? BigInteger t1 = op1.abs(),t2 = op2.abs();
?( t1 < t2 ){
????????op1 = BigInteger::ZERO;
??
??? deque< > temp;
>::reverse_iterator iter = t1.digits.rbegin();
??? BigInteger temp2( ( iter != t1.digits.rend() ){
????????temp2 = temp2 * BigInteger::TEN + BigInteger( ( )(*iter) );
?s =? ( temp2 >= t2 ){
????????????temp2 = temp2 - t2;
????????????s = s +? ????????temp.push_front( s );
????????iter++;
??? op1.digits.clear();
??? op1.digits.insert( op1.digits.end(),Monaco">??? op1.trim();
??? op1.sign = ( (op1.sign && op2.sign) || (!op1.sign && !op2.sign) );
%=(BigInteger& op1,Monaco">?BigInteger& op2)? ?op1 -= ((op1 / op2)*op2);
?BigInteger& op1,Monaco">??? BigInteger temp(op1);
??? temp += op2;
?temp;
??? temp -= op2;
??? temp *= op2;
??? temp /= op2;
??? temp %= op2;
?BigInteger& op){?
??? BigInteger temp = BigInteger(op);
??? temp.sign = !temp.sign;
++(BigInteger& op){???
??? op += BigInteger::ONE;
?op;
++(BigInteger& op,Monaco">?x){
??? BigInteger temp(op);
??? ++op;
--(BigInteger& op){???
??? op -=??BigInteger::ONE;
--(BigInteger& op,Monaco">??? --op;
( op1.sign != op2.sign )
?!op1.sign;
(op1.digits.size() != op2.digits.size())
?(op1.sign && op1.digits.size()<op2.digits.size())
????????|| (!op1.sign && op1.digits.size()>op2.digits.size());
>::const_reverse_iterator iter1,iter2;
????????iter1 = op1.digits.rbegin();iter2 = op2.digits.rbegin();
( iter1 != op1.digits.rend() ){
(??op1.sign &&??*iter1 < *iter2 )? (??op1.sign &&??*iter1 > *iter2 )? ( !op1.sign &&??*iter1 > *iter2 )? ( !op1.sign &&??*iter1 < *iter2 )? ( op1.sign != op2.sign??|| op1.digits.size() != op2.digits.size() )
>::const_iterator iter1,Monaco">??? iter1 = op1.digits.begin();
??? iter2 = op2.digits.begin();
( iter1!= op1.digits.end() ){
( *iter1 != *iter2 )?? ????????iter1++;
????????iter2++;
?!(op1==op2);
?(op1>op2) || (op1==op2);
?(op1<op2) || (op1==op2);
?!(op1<=op2);
ostream&? <<(ostream& stream,Monaco">?BigInteger& val){???? ?(!val.sign)
????????stream <<? " " ?( vector< >::const_reverse_iterator iter = val.digits.rbegin(); iter != val.digits.rend() ; iter++)
????????stream << ( )((*iter) +? ?stream;
istream&? >>(istream& stream,BigInteger& val){???? Input the BigInteger ?str;
??? stream >> str;
??? val=BigInteger(str);
BigInteger gcd (BigInteger m,BigInteger n)
( m < n )
??????????????? std::swap(m,n);
?( n == BigInteger( ))
?m;
?gcd(n,m%n);
BigInteger lcm(BigInteger m,Monaco">?m * n /gcd(m,Monaco">?main()
????????std:: ?b1,b2;
do
????????{
??????????????? std:: cin >>b1>>b2;
?( b1 == b2 && b1 ==? ???????????????????????? ??????????????? BigInteger ret = lcm(BigInteger(b1),BigInteger(b2));
cout <<ret<<std::endl;
????????} ( }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读