昨天面试有个题,时间太紧,来不及写了,回家调试一下:
函数原型 bool add(const char *A, const char *B, char * dest);
思路: 模拟人工加法的过程,先从末尾开始加。如果存在进位,则标记
#include <iostream>
using namespace std;
bool add(const char *A, const char *B, char * dest)
{
if(NULL == A || NULL == B || NULL == dest)
{
return false;
}
int iLenA = strlen(A);
int iLenB = strlen(B);
const char *pBTail = (B+iLenB-1);
const char *pATail = (A+iLenA-1);
bool bIsNeed = false; //标记是否需要进位
int iMaxLen = (iLenB>iLenA?iLenB:iLenA);
char *ret = new char[iMaxLen+2];
memset(ret,0,iMaxLen+2);
const char *head = ret;
for(;iLenA>=0||iLenB>=0;iLenA--,iLenB--,pBTail--,pATail--)
{
char c1 = *pATail;
char c2 = *pBTail;
// 如果位数不够,则用'0'替换
if(iLenA<=0)
{
c1 = '0';
}
if(iLenB<=0)
{
c2 = '0';
}
char temp = c1 + c2
- '0' + (bIsNeed==true?1:0);
if(temp > '9')
{
bIsNeed = true;
temp -= 10;
}
if(iLenA<=0 && iLenB<=0 && temp == '0')
{
break;
}
*ret = temp;
ret++;
}
//将字符串反转保存
int len = strlen(head);
dest[len] = '\0';
char *pTail = (dest + len - 1);
while(*head != '\0')
{
*(pTail--) = *(head++);
}
return true;
}
void main()
{
char *a = "99999999999999999999990";
char *b = "11";
char *c = new char[50];
memset(c,0,10);
add(a,b,c);
cout<<c;
}
测试用例:
a '9999999999990' ,b '11'
a '0',b '1199999000'
a '0',b '0'
a '555555',b '555555'
a '1',b '999999999999999999'
a '9',b '9'