大数相加模板--C/C++版
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
char sum[MAX];
void change(char *p1,char *p2)//消除p2的前置零,比如:p2="0000120" 得出p1="120"
{
int i,j;
for(i=0;i<strlen(p2);i++)
{
if('0'!=p2[i])
{
break;
}
}
if(i==strlen(p2))
{
p1[0]='0';
p1[1]='\0';
}
else
{
j=0;
for(i;i<strlen(p2);i++)
{
p1[j]=p2[i];
j++;
}
p1[j]='\0';
}
}
int getsum(char *a,char *b,int a_length,int b_length,int flag)
//flag等于0表示a_length==b_length flag等于1表示a_length>b_length
{
sum[a_length]='\0';
int tag=a_length-1;
sum[a_length]='\0';
int i;
int psw=0;//向高位进位状态
int he;//同位和
int a1;//a当前位对应的数字
int b1;//b当前位对应的数字
for(i=b_length-1;i>=0;i--)
{
a1=(int)(a[tag]-48);
b1=(int)(b[i]-48);
he=a1+b1+psw;//本位和加上低位来的进位
psw=0;
if(he>=10)
{
he=he-10;
psw=1;
}
sum[tag]=(char)(he+48);
tag--;
}
if(!flag)
{
return psw;
}
else
{
int j;
for(j=tag;j>=0;j--)
{
a1=(int)(a[j]-48);
he=a1+psw;
psw=0;
if(he>=10)
{
he=he-10;
psw=1;
}
sum[j]=(char)(he+48);
}
return psw;
}
}
int funsum(char *c,char *d)
{
char a[MAX],b[MAX];
change(a,c);//消除c的前置零
change(b,d);
//调试
/*
printf("a=");
puts(a);
printf("b=");
puts(b);
*/
int a_length=strlen(a);
int b_length=strlen(b);
int first;//两个数相加之后结果最高位的进位标志
if(a_length==b_length)
{
first=getsum(a,b,a_length,b_length,0);
}
if(a_length>b_length)
{
first=getsum(a,b,a_length,b_length,1);
}
if(a_length<b_length)
{
first=getsum(b,a,b_length,a_length,1);
}
return first;
}
int main()
{
char a[MAX],b[MAX];
while(scanf("%s%s",a,b)!=EOF)
{
int flag=funsum(a,b);
if(flag==1)
{
printf("1");
puts(sum);
}
else
{
puts(sum);
}
getchar();
}
return 0;
}