可以模拟竖式加减法。
无符号整数加法就简单点,如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *_add(char *result, int resultLen, char *s, int sLen)
{
char *p1=result+resultLen-1;
char *p2=s+sLen-1;
for (; p1>=result && p2>=s; p1--, p2--)
*p1 += *p2-'0';
return result;
}
char *_Carry(char *result, int resultLen)
{
char *p=result+resultLen-1;
for (; p>=result; p--)
{
if (*p >= 10)
{
*p = *p-10;
*(p-1) += 1;
}
*p = *p+'0';
}
if (*result == '0')
strcpy(result, result+1);
return result;
}
char *_addition(char *s1, char *s2)
{
int s1Len = strlen(s1);
int s2Len = strlen(s2);
int resultLen
= 1 + (s1Len>s2Len?s1Len:s2Len);
char *result = (char*)calloc(resultLen+1, sizeof(char));
_add(result, resultLen, s1, s1Len);
_add(result, resultLen, s2, s2Len);
_Carry(result, resultLen);
return result;
}
main()
{
char s1[256], s2[256];
printf("被加数:"); gets(s1);
printf("加数:"); gets(s2);
char *ans = _addition(s1, s2);
printf("和:"); puts(ans);
free(ans);
}
思路:
1、无符号整数加法:
如:“456” + “9789”
1)分配6字节空间,前5字节存放各位对应的“和”运算结果:0,9,11,13,15,'\0'
2)从右到左各位满10进1:当前位-=10,前一位+=1,结果:1,0,2,4,5,'\0'
3)将各位数字转换为字符成串得出结果:10245
2、有符号整数加法:
1)同号相加。算法同上面,结果取符号。
2)异号相加。不同点:
(1)数字串等长直接比较大小,不等长取较长者为大,分配 较大者长度+2字节空间,结果符号取较大者符号。
(2)各位对应用“减法”运算。
(3)从右到左处理各位<0借10:当前位+=10,前一位-=1。