容易出错的地方在于 字符串的0位恰好代表长整数的高位
*
详细描述:char* LongIntegerMul(char* pNum1, char *pNum2);
输入参数:
char* pNum1:使用字符串表示的长整数1
char* pNum2:使用字符串表示的长整数2
输出参数(指针指向的内存区域保证有效):
无。
返回值:
char*:使用字符串表示结果整数,
内存动态申请内存保存结果,外部调用者释放。
*/
#include <iostream>
using namespace std;
int mulChar(char a,char b)
{
return (a-'0')*(b-'0');
}
void charPlus(char* str, int pos,int adder,int n)
{
if((pos>=0)&&(pos<n))
{
int num=(str[pos]-'0'+adder);
str[pos]='0'+(num%10);
int carry=num/10;
int pp=pos-1;
while(carry>0)
{
//以下两句如果交换位置后果严重
int temp=str[pp]-'0'+carry; //获取pp位置处得新值
carry=temp/10;
str[pp]=(temp%10)+'0';// 此处应该是+=和+,而不是=和-;
pp--; // 注意这里是--而不是++;
}
}
}
char* LongIntegerMul(char* pNum1, char *pNum2)
{
// 对入参需要检查,入参为空或者入参长度为0都直接返回字符串"0"
if(pNum1==NULL||pNum2==NULL) return "0";
int n2=static_cast<int>(strlen(pNum2)); //是字符串中含有字符的个数,不含结束符号
int n1=static_cast<int>(strlen(pNum1));
if(n1==0||n2==0) return "0";
char* str=new char[n1+n2+1];
memset(str,'0',n1+n2);
str[n1+n2]='\0'; //最后一个符号置为结束符号
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
int pos=(n1+n2-1)-(i+j); //pos的最大值是n1+n2-1而n1+n2那一位依靠进位得到
int pos1=n1-1-i; // 真实数字的第i位
int pos2=n2-1-j; //真实数字的第j位
int res=mulChar(pNum1[pos1],pNum2[pos2]);
int carry=res/10;
charPlus(str,pos,(res%10),n1+n2); //自加操作
if(carry>0)
{
charPlus(str,pos-1,carry,n1+n2); //注意此处为-1
}
}
}
return str;
}