实现思路:
1、先将两数倒序排列
2、从0到len-1位按位相加,和大于10设置进位标示;
3、处理两数位数相比多出的部分;
4、将结果以及原来两个加数倒序;
#include 《string.h〉
#include 〈stdlib.h》
#define MAX 100 //最大支持的位数
//倒序
void revnum(char *a)
{
int len = strlen(a);
char t;
for(int i = 0; i< len/2; i++)
{
//i与j交换位置 i与len-i-1交换
t = *(a+i);
*(a+i) = *(a+(len-i-1));
*(a+(len-i-1)) = t;
}
}
//大数加法(不考虑负数)
char * bigAdd(char *a,char *b)
{
revnum(a);
revnum(b);
int lena = strlen(a);
int lenb = strlen(b);
int lenc = lena;
if(lenb > lenc)
{
lenc = lenb;
}
char * result = (char *)malloc(lenc+1);
int t;
int carry = 0;
char *flagChar;
char *flagresult;
bool flag = false;
for(int i = 0 ; i<lenc;i++)
{
//t = (*a(i)) + (*b(i));// -'0'-'0' + carry;
if ( a[i] == '/0' )
{
flag = true;
flagChar = &b[i];
flagresult = result+i;
break;
}
if(b[i] == '/0')
{
flag = true;
flagChar = &a[i];
flagresult = result+i;
break;
}
t = a[i] +b[i]-'0'-'0' + carry ;
if( t > 9)
{
itoa(t-10,result+i,10);
carry= 1;
}
else
{
itoa(t,result+i,10);
carry =0;
}
}
//两个加数长度不相同
if(flag)
{
while(*(flagChar) != '/0')
{
t = flagChar[0] -'0' + carry ;
if( t > 9)
{
itoa(t-10,flagresult++,10);
carry= 1;
}
else
{
itoa(t,flagresult++,10);
carry =0;
}
flagChar++;
}
}
if ( carry != 0)
{
*(result+lenc) = '1';
*(result+lenc+1) = '/0';
}
else
{
*(result+lenc) = '/0';
}
//printf("len:%d/n",lena);
revnum(result);
revnum(a);
revnum(b);
return result;
}
int main()
{
char a[MAX];//= "321";
char b[MAX];//= "26";
while(1)
{
printf("分别输入两个加数/n");
gets_s(a);
gets_s(b);
char *add = bigAdd(a,b);
printf(" %s/n+%s/n-------/n %s/n",a,b,add);
char t[2];
printf("是否继续(y/n)(输入n退出)?/n");
if(getchar() == 'n') break;
//清空缓冲区
flushall();
}
}