void multiply(const char *strNum1, const char *strNum2, char *pOut)
{
size_t len1=strlen(strNum1)-1;
size_t len2=strlen(strNum2)-1;
char *pend1=strNum1+len1;
char *pend2=strNum2+len2;
unsigned carry=0;
unsigned product=0;
unsigned addition=0;
memset(pOut, '0', (len1+len2+2));
for(size_t i=0; i<=len2; ++i)
{
for(size_t j=0; j<=len1; ++j)
{
product=(*(pend2-i)-'0')*(*(pend1-j)-'0')+carry;
addition=(*(pOut+i+j)-'0')+product%10;
*(pOut+i+j)=addition%10+'0';
carry=product/10+addition/10;
}
*(pOut+i+len1+1)+=carry;
carry=0;
}
char *pend=pOut+len1+len2+1;
if(*pend=='0')
{
*pend=0;
--pend;
}
else
*(pend+1)=0;
char c=0;
while(pOut<=pend)
{
c=*pOut;
*pOut++=*pend;
*pend--=c;
}
}
{
size_t len1=strlen(strNum1)-1;
size_t len2=strlen(strNum2)-1;
char *pend1=strNum1+len1;
char *pend2=strNum2+len2;
unsigned carry=0;
unsigned product=0;
unsigned addition=0;
memset(pOut, '0', (len1+len2+2));
for(size_t i=0; i<=len2; ++i)
{
for(size_t j=0; j<=len1; ++j)
{
product=(*(pend2-i)-'0')*(*(pend1-j)-'0')+carry;
addition=(*(pOut+i+j)-'0')+product%10;
*(pOut+i+j)=addition%10+'0';
carry=product/10+addition/10;
}
*(pOut+i+len1+1)+=carry;
carry=0;
}
char *pend=pOut+len1+len2+1;
if(*pend=='0')
{
*pend=0;
--pend;
}
else
*(pend+1)=0;
char c=0;
while(pOut<=pend)
{
c=*pOut;
*pOut++=*pend;
*pend--=c;
}
}