多位字符串数进行相乘,如字符串“123”与字符串“321”相乘结果保存成字符串“39483”

/************************************************************************/
/*功能:多位字符串数进行相乘,如字符串“123”与字符串“321”
/*                              相乘结果保存成字符串“39483” */
/*参数:ppRet   保存积的字符串的指针
/*      pMul1   被乘数字符串
/*      PMul2   乘数字符串
/*作者:王丽君
/*QQ:174636594
/*个人主页:http://hi.csdn.net/space.php
/************************************************************************/
void Multyple(char** ppRet, const char* pMul1, const char* pMul2)
{
 const int icMul1 = strlen(pMul1);//被乘数的长度
 const int icMul2 = strlen(pMul2);//乘数的长度
 const int icRet = icMul1 + icMul2 + 1;//结果的最大长度
 int iTemp = 0;//中间变量
 int iFlag = 0;//相乘后,需要进的位数
 
 for (int i2 = icMul2-1; i2 >= 0; i2--)//控制乘数
 {
  for (int i1 = icMul1-1; i1 >= 0; i1--)//控制被乘数
  {
   iTemp = int(pMul1[i1]-'0') * int(pMul2[i2]-'0');//将字符数转换成整数进行相乘
   if ((*ppRet)[(icMul2+icMul1-2)-(i2+i1)] != '/0')
   {//如果相应位中有数,则将原来的数与现在相乘得到的数进行相加
    iTemp += int((*ppRet)[(icMul2+icMul1-2)-(i2+i1)]-'0');
   }
   iTemp += iFlag;//将结果与前一次计算所得的进位进行相加
   iFlag = iTemp/10;//得到这次结果,需往前面,进的位
   iTemp -= (iFlag*10);//得到此时的数
   (*ppRet)[(icMul2+icMul1-2)-(i2+i1)] = char(iTemp + '0');//将整数转换为字符,保存到相应的位中。
  }
  if(iFlag != 0)//判断乘数与被乘数的最高位相乘后,是否有进位
  {
   (*ppRet)[(icMul2+icMul1-2)-(i2+i1)] = char(iFlag + '0');
   iFlag = 0;
  }
 }

 //将得到的结果,进行翻转。
 char cTmp;
 int iRetLen = strlen(*ppRet);
 for (int i = 0; i < iRetLen/2; i++)
 {
  cTmp = (*ppRet)[i];
  (*ppRet)[i] = (*ppRet)[iRetLen-i-1];
  (*ppRet)[iRetLen-i-1] = cTmp;
 }
}

 

测试:

int main(void)
{
 char c1[] = "123";
 char c2[] = "321";
 char* pRet = new char[strlen(c1)+strlen(c2)+1];
 memset(pRet, 0, strlen(c1)+strlen(c2)+1);
 Multyple(&pRet, c1, c2);
 cout << pRet << endl;
 delete[]pRet;
 pRet = NULL;

 

 cin.get();

 return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值