大きい整数クラスの4則演算と論理演算
今日「アルゴリズムコンテストと入門基礎」の大きな整数クラスを見た後、私自身も大きな整数クラスを実現してみました.そして、整数の4つの演算と論理演算機能を完成しました.いろいろ勉強しました.ここで共有します.コードはC++です.C++のSTLテンプレートクラスvectorを使用しました.
大きい整数クラスのデータストレージ構造は次のようになります.
static const int BASE=100000000; static const int WIDTH=8; std::vector s;
以下、本の中の既存の基礎の上で乗除と減算のコードを書き続けます.
今日「アルゴリズムコンテストと入門基礎」の大きな整数クラスを見た後、私自身も大きな整数クラスを実現してみました.そして、整数の4つの演算と論理演算機能を完成しました.いろいろ勉強しました.ここで共有します.コードはC++です.C++のSTLテンプレートクラスvectorを使用しました.
大きい整数クラスのデータストレージ構造は次のようになります.
static const int BASE=100000000; static const int WIDTH=8; std::vector s;
以下、本の中の既存の基礎の上で乗除と減算のコードを書き続けます.
class BigInteger
{
public:
//
static const int BASE=100000000;
static const int WIDTH=8;
std::vector s;
//
BigInteger(long long num=0)
{
*this=num;
}
//long long
BigInteger operator = (long long num)
{
s.clear();
do{
s.push_back(num%BASE);
num/=BASE;
}while(num);
return *this;
}
//string
BigInteger operator = (const std::string &str)
{
s.clear();
int x,len=(str.length()-1)/WIDTH+1;
for(int i=0;i
//
int end=str.length()-i*WIDTH;
int start=std::max(0,end-WIDTH);
// sscnaf , , , 。
sscanf(str.substr(start,end-start).c_str(),"%d",&x);
s.push_back(x);
}
return *this;
}
//
BigInteger operator + (const BigInteger& b) const
{
BigInteger c;
c.s.clear();
for(int i=0,g=0;;i++)
{
if(g==0&&i>=s.size()&&i>=b.s.size())
break;
int x=g;
if(i
// ,
BigInteger operator - (const BigInteger& b) const
{
BigInteger c;
c.s.clear();
int MAX=std::max(s.size(),b.s.size());
for(int i=0,g=0;;i++)
{
if(g==0&&i>=MAX)
break;
int x=g;
if(i
//!!!!!!
if(i==MAX-1)
c.s.push_back(x%BASE);
else
c.s.push_back(abs(x%BASE));
//!!!!!!
g=x/BASE;
}
return c;
}
BigInteger operator -= (const BigInteger& b)
{
*this=*this-b;
return *this;
}
// , , vector string , , 。
BigInteger operator * (const BigInteger& b)
{
std::stringstream ss;
for(int i=s.size()-1;i>=0;i--)
ss<=0;i--)
ss<
// string int
std::vector c,d,temp;
for(int i=operand1.length()-1;i>=0;i--)
c.push_back(operand1[i]-'0');
for(int i=operand2.length()-1;i>=0;i--)
d.push_back(operand2[i]-'0');
int MAX=std::max(c.size(),d.size());
for(int i=0;i9)
{
temp[i+1]+=temp[i]/10;
temp[i]%=10;
}
int m=2*MAX;
while(temp[m]==0)
m--;
BigInteger another;
another.s.clear();
int len=(m-1)/WIDTH+1;
for(int i=0;i
// , int
BigInteger operator / (const BigInteger& b)
{
std::string operand1,operand2,result;
std::stringstream ss;
for(int i=s.size()-1;i>=0;i--)
ss<=0;i--)
ss< c,d;
for(int i=0;id[j]) // operand1 > operand2
{
ok=1;
break;
}
else if(c[i+j]
// ,
BigInteger operator % (const BigInteger& b)
{
BigInteger c;
c=*this-(*this/b)*b;
return c;
}
BigInteger operator %= (const BigInteger& b)
{
*this=*this%b;
return *this;
}
bool operator < (const BigInteger& b) const
{
if(s.size()!=b.s.size())
return s.size()=0;i--)
if(s[i]!=b.s[i])
return s[i] (const BigInteger& b) const
{
return b= (const BigInteger& b) const
{
return !(*thisb;
}
bool operator == (const BigInteger& b) const
{
return !(*thisb);
}
friend std::ostream& operator << (std::ostream& out,const BigInteger& x)
{
out<=0;i--)
{
char buf[20];
sprintf(buf,"%08d",x.s[i]);
for(int j=0;j> (std::istream& in,BigInteger& x)
{
std::string s;
if(!(in>>s))
return in;
x=s;
return in;
}
};
, 。
, , , 。
:《 》。