先写两个简单的,加和减,原理就是逐个字符相加减,如果有进位和借位做个标记,继续下一个字符的操作。 代码并不完善,比如减法暂时不考虑不够减的问题,请大家注意。 //相加 char* AddNum(char* a,char* b) { int maxlen = max(strlen(a),strlen(b)); //多申请两个字符,一个是结束符'/0',一个是放到第一个字符,当两个数最高位相加后,如果有进位,保存到这里 char* p = new char[maxlen+2]; //为最后一位写上结束符 *(p+maxlen+1)='/0'; //声明两个指针分别指向a和b的末尾,不包含结束符 char* pA=a+strlen(a)-1; char* pB=b+strlen(b)-1; int m=0; int n=0; //进位 int c=0; for (int i=maxlen;i>0;i--) { m = n = 0; //因为当pA到达第一个字符时,即pA=a时,也要进行计算,所以这里用(pA-1)来判断 //因为字符'0'的Asic是48,所以1就是49,要转成数字,就要减去48 if ((pA+1) != a) { m = *pA - 48; pA--; } if ((pB+1) != b) { n = *pB - 48; pB--; } //为p指针的第i个字符赋值 *(p+i) = (m+n+c) % 10 + 48; //取得进位 c = (m+n+c) / 10; } *p = 48+c; return p; } //相减 char* SubNum(char* a,char* b) { int maxlen = max(strlen(a),strlen(b)); //不考虑被减数最高位不够减的情况 char* p = new char[maxlen+1]; //为最后一位写上结束符 *(p+maxlen)='/0'; //声明两个指针分别指向a和b的末尾,不包含结束符 char* pA=a+strlen(a)-1; char* pB=b+strlen(b)-1; int m=0; int n=0; //借位位 int c=0; for (int i=maxlen-1;i>=0;i--) { m = n = 0; //因为当pA到达第一个字符时,即pA=a时,也要进行计算,所以这里用(pA-1)来判断 //因为字符'0'的Asic是48,所以1就是49,要转成数字,就要减去48 if ((pA+1) != a) { m = *pA - 48; pA--; } if ((pB+1) != b) { n = *pB - 48; pB--; } //不够减,要借位 if (m<n) { //为p指针的第i个字符赋值 *(p+i) = 10+m-n-c + 48; c = 1; } else { //虽然够减,但是如果再算是借走的一位,那么就小于0了 if (m-n-c<0) *(p+i) = 10+m-n-c + 48; else { *(p+i) = m-n-c + 48; c = 0; } } } return p; } int main() { char* a="75546666666666666666666666666663366667554666666666665676787667678666336666"; char* b="66666666666666666666666666666666666667554666666666666654656565675666336666"; char* p =AddNum(a,b); printf("%s/n","两数相加等于:"); printf("%s/n",p); p =SubNum(a,b); printf("%s/n","两数相减等于:"); printf("%s/n",p); return 0; }