📄 cccc.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 + -