/*写了一个计算大数四则运算的类(乘法和除法并为写出来,读者可以自己相似推导).
这个类的思想是用字符串数组表示大数,
这并不是最好最有效的方法,but it works :)
I_Love_CPP*/
class CLargeNumberS
{
public:
CLargeNumberS(char* pStr){
m_pStrIn = pStr;
m_pStrOut = NULL;
m_nLen = strlen(m_pStrIn);
}
~CLargeNumberS(){
if(m_pStrOut)
delete[] m_pStrOut;
}
CLargeNumberS(CLargeNumberS& N){
m_pStrIn = N.m_pStrIn;
m_pStrOut = NULL;
m_nLen = strlen(m_pStrIn);
}
const char* operator + (CLargeNumberS& N){
if(m_pStrOut)
delete[] m_pStrOut;
m_pStrOut = new char[max(m_nLen,N.m_nLen) + 2];
int i = m_nLen-1, j = N.m_nLen-1,
k = 0,
n = 0;//进数
int nTemp;
while (true) {
if((i<0)&&(j<0)){
if(n>0) m_pStrOut[k++] = n + '0';
break;
}
else if(i<0) nTemp = N.m_pStrIn[j] + n;
else if(j<0) nTemp = m_pStrIn[i] + n;
else nTemp = m_pStrIn[i] + N.m_pStrIn[j] + n - '0';
n = 0;
if(nTemp > '9'){//两数相加,最多向前进1,因此不需用while
nTemp = nTemp - 10;
++n;//向前进1
}
m_pStrOut[k] = nTemp;
--i;--j;++k;
}
m_pStrOut[k] = 0;//字符串结束符
//反转字符串
char a;
for(i = 0; i < k/2; ++i){
a = m_pStrOut[i];
m_pStrOut[i] = m_pStrOut[k-i-1];
m_pStrOut[k-i-1] = a;
}
return m_pStrOut;
}
const char* operator - (CLargeNumberS& N){
if(m_pStrOut)
delete[] m_pStrOut;
m_pStrOut = new char[max(m_nLen,N.m_nLen) + 2];
int i = m_nLen-1, j = N.m_nLen-1,
k = 0,
n = 0;//借数
int nTemp;
//为了简化运算,先比较2个数的大小
if(m_nLen<N.m_nLen){
strcpy(m_pStrOut,N - (*this));
m_pStrOut[0] = '-';
return m_pStrOut;
}
else if(m_nLen ==N.m_nLen){
if(strcmp(m_pStrIn,N.m_pStrIn) < 0){
strcpy(m_pStrOut,N - (*this));
m_pStrOut[0] = '-';
return m_pStrOut;
}
}
while (true) {
if((i<0)&&(j<0)){
if(n>0) m_pStrOut[k++] = '-';
break;
}
//else if(i<0)这种情况不会出现
else if(j<0) nTemp = m_pStrIn[i] - n;
else nTemp = m_pStrIn[i] - N.m_pStrIn[j] - n;
if(nTemp < '0'){
nTemp = n + '0' - m_pStrIn[i];
n = 1;//向前借1
}
--i;--j;++k;
}
m_pStrOut[k] = 0;//字符串结束符
//反转字符串
char a;
for(i = 0; i < k/2; ++i){
a = m_pStrOut[i];
m_pStrOut[i] = m_pStrOut[k-i-1];
m_pStrOut[k-i-1] = a;
}
return m_pStrOut;
}
protected:
CLargeNumberS();
private:
CLargeNumberS& operator = (CLargeNumberS&);
private:
char* m_pStrIn;
char* m_pStrOut;
int m_nLen;
};