#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STRLENTH 100
/*数组转置*/
void reverse(char str[])
{
int left = 0;//第一个元素
int right = strlen(str)-1;//最后一个元素
char temp;
while(left < right)
{
temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
}
char* big_num_add(char str1[],char str2[])
{
int n1 = strlen(str1); //求第一个加数的位数
int n2 = strlen(str2); //求第二个加数的位数
int n = n1>n2 ? n1:n2; //求两个加数中最大的位数
int i = 0;
int flag = 0; //进位值,个位相加时,没有进位
char sum ; //每一位相加的和
char *str3; //存放和
/*存放加数的和,两个加数的最大位+两位,存放('\0'(reverse函数用到,strlen)及最高位有可能产生的进位)*/
str3 = (char*)malloc(sizeof(char)*(n+2));
n1--;//指向最低位的下标(从个位开始计算)
n2--;
while(n1 >= 0 && n2 >= 0)
{
/*求每一位上的和:本位和 + 进位*/
sum = str1[n1] + str2[n2] + flag - '0';
/*有进位*/
if(sum > '9')
{
str3[i] = sum - 10; //去掉进位后存于数组中
flag = 1; //有进位,加法进位只能是1
}
/*无进位*/
else
{
str3[i] = sum;
flag = 0;
}
/*为下一位做准备*/
n1--;
n2--;
i++;
}
/*处理位数高的剩余位*/
if(n1 > n2)//第一位没有处理完
{
// for(;n1>=0;n1--)
while(n1 >= 0)
{
sum = str1[n1] + flag ;//上一位的进位
if(sum > '9')
{
str3[i] = sum - 10; //去掉进位后存于数组中
flag = 1; //有进位,加法进位只能是1
}
else
{
str3[i] = sum;
flag = 0;
}
n1--;
i++;
}
}
if(n2 > n1)//第二个加数,没有处理完
{
while(n2 >= 0)
{
sum = str2[n2] + flag ;//上一位的进位
if(sum > '9')
{
str3[i] = sum - 10; //去掉进位后存于数组中
flag = 1; //有进位,加法进位只能是1
}
else
{
str3[i] = sum;
flag = 0;
}
n2--;
i++;
}
}
/*加完之后看看是否有进位:99+999,加完之后仍有进位*/
if(flag == 1)
{
str3[i] = '1';
i++;
str3[i] = '\0';
}
else
str3[i] = '\0';//和数组最后赋值'\0'
/*上述操作执行完后,低位存到了前面,高位存在了后面,所以得转置过来*/
reverse(str3);
return str3;
}
int main()
{
char add1[STRLENTH];
char add2[STRLENTH];
gets(add1);
gets(add2);
printf("the sum is:%s\n",big_num_add(add1,add2));
return 0;
}