/*
A B
将绝对值较大的P放在前面,绝对值较小的Q放在后面
如果两个都是正数,则直接相加;
负数,则直接相加;
3 -5 结果为负
-3 5 结果为正
如果一正一负,做减法。
如果结果大于0,并且是PN类型,则输出结果。
如果结果大于0,
*/
#include <string.h>
#include <stdio.h>
#define TO_DEC(x) ((x) - '0')
#define TO_CHAR(x) ((x) + '0')
enum oprType{PP, PN, NN};
void add(const char * lStr, const char * rStr,
char * retStr)
{
if(lStr == 0 || rStr == 0 || retStr == 0)
return ;
const char * lOpr = lStr;
const char * rOpr = rStr;
const char * pLEnd;
const char * pREnd;
const char * tmpOpr = 0;
int retIndex = 0;
int retLen = 0;
int result = 1; //结果的符号
int tmpRet;
int base = 1;
int carry = 0; //进位
bool allZero =false;
//确定结果的符号
if(*lOpr == '-' && *rOpr != '-')
{
// -3 52
// -5 33
lOpr++;
base = -1;
if(strlen(lOpr) < strlen(rOpr))
{
result = 1;
tmpOpr = lOpr;
lOpr = rOpr;
rOpr = tmpOpr;
}
else if(strlen(lOpr) > strlen(rOpr))
{
result = -1;
}
else
{
if(strcmp(lOpr, rOpr) <= 0)
{
result = 1;
tmpOpr = lOpr;
lOpr = rOpr;
rOpr = tmpOpr;
}
else
result = -1;
}
}
else if(*lOpr != '-' && *rOpr == '-')
{
// 2 -53
// 5 -3
rOpr++;
base = -1;
if(strlen(lOpr) < strlen(rOpr))
{
result = -1;
tmpOpr = lOpr;
lOpr = rOpr;
rOpr = tmpOpr;
}
else if(strlen(lOpr) > strlen(rOpr))
{
result = 1;
}
else
{
if(strcmp(lOpr, rOpr) <= 0)
{
result = -1;
tmpOpr = lOpr;
lOpr = rOpr;
rOpr = tmpOpr;
}
else
result = 1;
}
}
else if(*lOpr == '-' && *rOpr == '-')
{
lOpr++;
rOpr++;
if(strlen(lOpr) < strlen(rOpr))
{
tmpOpr = lOpr;
lOpr = rOpr;
rOpr = tmpOpr;
}
result = -1;
}
else
{
result = 1;
if(strlen(lOpr) < strlen(rOpr))
{
tmpOpr = lOpr;
lOpr = rOpr;
rOpr = tmpOpr;
}
}
//计算结果,在这之前,已经保证了lOpr指向较大绝对值的数,
//rOpr指向较小绝对值的数
pLEnd = lOpr + strlen(lOpr) - 1;
pREnd = rOpr + strlen(rOpr) - 1;
while(pLEnd >= lOpr)
{
if(pREnd >= rOpr)
{
tmpRet = TO_DEC(*pLEnd) + TO_DEC(*pREnd) * base + carry;
pREnd--;
}
else
{
tmpRet = TO_DEC(*pLEnd) + carry;
}
carry = 0;
if(tmpRet < 0)
{
tmpRet += 10;
carry = -1;
}
else if(tmpRet >= 10)
carry = tmpRet / 10 ;
retStr[retIndex++] = TO_CHAR(tmpRet%10);
pLEnd--;
}
if(carry > 0)
{
retStr[retIndex++] = TO_CHAR(carry);
}
//消去后面的0
retIndex -= 1;
while(retStr[retIndex] == '0' && retIndex > 0)
retStr[retIndex--] = 0;
if(result < 0)
retStr[++retIndex] = '-';
retStr[++retIndex] = 0;
//反转字符串
retLen = strlen(retStr);
for(retIndex = 0; retIndex < retLen/2; retIndex++)
{
tmpRet = retStr[retIndex];
retStr[retIndex] = retStr[retLen - retIndex - 1];
retStr[retLen - retIndex-1] = tmpRet;
}
}
int main()
{
char lStr[10] = "-5";
char rStr[10] = "4324";
char result[20];
add(lStr, rStr, result);
printf("%s + %s = %s\n", lStr, rStr, result);
return 0;
}