⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cccc.txt

📁 用单链表实现的长整数加减法
💻 TXT
字号:
#include <iostream>
#include <deque>
#include <string>
#include <sstream>
using namespace std;

class CLongInt;
CLongInt abs(CLongInt li);

namespace CLongIntDef
{
const int intDataSize = 4;
}

class CLongInt
{
public:
CLongInt(string sData);
string ToString() const;
bool operator > (CLongInt li);
CLongInt operator + (CLongInt li);
CLongInt operator - (CLongInt li);
CLongInt operator - ();
private:
deque<int> m_deqData;
bool m_bPositive;
};

CLongInt::CLongInt(string sData)
{
string sCurrent;
if (sData.at(0) == '+' || sData.at(0) == '-')
{
  m_bPositive = (sData.at(0) == '+');
  sData.erase(0, 1);
}
else
  m_bPositive = true;

while (sData.size() > 0)
{
  if ((int)sData.size() < CLongIntDef::intDataSize)
  {
   m_deqData.push_front(atoi(sData.c_str()));
   return;
  }
  else
  {
   sCurrent = string(sData, sData.size()-CLongIntDef::intDataSize, sData.size());
   sData.erase(sData.size()-CLongIntDef::intDataSize, sData.size());
   m_deqData.push_front(atoi(sCurrent.c_str()));
  }
}
}

string CLongInt::ToString() const
{
stringstream ss;
char charar[5];
int intCount;

if (!m_bPositive)
  ss << "-";
for (intCount = 0; intCount < (int)m_deqData.size(); intCount++)
{
  if (intCount == 0)
   ss << m_deqData[intCount];
  else
  {
   sprintf(charar, "%04d", m_deqData[intCount]);
   ss << charar;
  }
}
return ss.str();
}

bool CLongInt::operator > (CLongInt li)
{
int intCount;
if (m_bPositive > li.m_bPositive)
  return true;
else if (m_bPositive < li.m_bPositive)
  return false;

if (m_deqData.size() > li.m_deqData.size())
  return m_bPositive;
if (m_deqData.size() < li.m_deqData.size())
  return !m_bPositive;

for (intCount = 0; intCount < (int)m_deqData.size(); intCount++)
{
  if (m_deqData[intCount] > li.m_deqData[intCount])
   return m_bPositive;
  if (m_deqData[intCount] < li.m_deqData[intCount])
   return !m_bPositive;
}

return !m_bPositive;
}

CLongInt CLongInt::operator + (CLongInt li)
{
CLongInt &liResult = abs(*this) > abs(li) ? abs(*this) : abs(li);
CLongInt &liSmall = abs(*this) > abs(li) ? abs(li) : abs(*this);
int intCount, intData, intFirst, intSecond;

for (intCount = 0; intCount < (int)liSmall.m_deqData.size(); intCount++)
{
  intFirst = liResult.m_deqData[(int)liResult.m_deqData.size() - 1 - intCount];
  intSecond = liSmall.m_deqData[(int)liSmall.m_deqData.size() - 1 - intCount];
  if (m_bPositive ^ li.m_bPositive)
   intData = intFirst - intSecond;
  else
   intData = intFirst + intSecond;

  liResult.m_deqData[(int)liResult.m_deqData.size() - 1 - intCount] = intData%10000;
  if (intData >= 10000)
  {
   if (intCount == liResult.m_deqData.size()-1)
    liResult.m_deqData.push_front(1);
   else
    liResult.m_deqData[(int)liResult.m_deqData.size() - 2 - intCount] += 1;
  }
  else if (intData < 0)
  {
   liResult.m_deqData[(int)liResult.m_deqData.size() - 2 - intCount] -= 1;
   liResult.m_deqData[(int)liResult.m_deqData.size() - 1 - intCount] = 10000+intData;
  }
}
if (!(m_bPositive ^ li.m_bPositive))
  liResult.m_bPositive = m_bPositive;
else if (abs(*this) > abs(li))
  liResult.m_bPositive = m_bPositive;
else
  liResult.m_bPositive = li.m_bPositive;

while (liResult.m_deqData[0] == 0)
  liResult.m_deqData.pop_front();
return liResult;
}

CLongInt CLongInt::operator - (CLongInt li)
{
return *this + (-li);
}

CLongInt CLongInt::operator - ()
{
CLongInt liResult(this->ToString());
liResult.m_bPositive = !liResult.m_bPositive;
return liResult;
}

CLongInt abs(CLongInt li)
{
return li > CLongInt("0") ? li : (-li);
}

ostream& operator << (ostream &o, CLongInt &li)
{
return o << li.ToString();
}


int main(int argc, char* argv[])
{
CLongInt in("123456789123"), i2("1111111111111");
cout << in+i2 << endl;
cout << in-i2 << endl;
return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -