/************************************************************************/
/*功能:多位字符串数进行相乘,如字符串“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;
}