a+b

来源:互联网 发布:软件测试具体流程 编辑:程序博客网 时间:2024/05/21 19:09

 

/*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 33lOpr++;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;}elseresult = -1;}}else if(*lOpr != '-' && *rOpr == '-'){// 2 -53// 5 -3rOpr++;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;}elseresult = 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);}//消去后面的0retIndex -= 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;}

0 0