用字符串数组实现的大数运算

/*写了一个计算大数四则运算的类(乘法和除法并为写出来,读者可以自己相似推导).
这个类的思想是用字符串数组表示大数,
这并不是最好最有效的方法,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;
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值