69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
char* big_add(char *a,char *b);
int main()
{
char a[1000]={0};
char b[1000]={0};
while(scanf("%s%s",a,b)!=EOF)
{
printf("%s + %s = ",a,b);
printf("%s\n",big_add(a,b));
}
return 0;
}
char* big_add(char *a,char *b)
{
/* 大数相加 ,两个加数以字符串的形式出现,返回指向结果的指针 */
char c[1000]={0};
char t[1000];
int length_short;
int length_long;
int length;
int i;
int j;
int k;
char *resultptr;
char *str;
k=0;
/* 使a成为位数较小的数 */
if (strlen(a)>strlen(b))
{
strcpy(t,a);
strcpy(a,b);
strcpy(b,t);
}
length_short=strlen(a);
length_long=strlen(b);
/* 将较少位数的数a的各位和较大位数的数b的后若干位依次相加,各位的和依次存在数组c中 */
for (i=length_short-1,j=length_long-1;i>=0;i--,j--)
{
if (a[i]-48+b[j]-48>=10)
{
/* 若相加的和大于10,则要进位 */
c[k]+=a[i]+b[j]-48-10;
k++;
c[k]+=1;
}
else
{
c[k]+=a[i]+b[j]-48;
if(c[k]-'0'>=10)
{
c[k]-=10;
k++;
c[k]+=1;
}
else
k++;
}
}
/* 如果两个数的位数不同,则将较多位数的数b的剩下位依次存到数组c中 */
for (;j>=0;j--)
{
if(c[k]+b[j]-48>=10)
{
c[k]+=b[j]-10;
k++;
c[k]+=1;
}
else
{
c[k]+=b[j];
k++;
}
}
/* 若果两个数位数相同,且最高位有进位 */
if (c[k]!=0)
{
c[k]+=48;
c[k+1]='\0';
}
else
c[k]='\0';
length=strlen(c);
resultptr=(char*)malloc(length+1);
if(!resultptr)
exit(1);
str=resultptr;
for(i=length-1;i>=0;i--)
*str++=c[i];
*str='\0';
return resultptr;
}
结果:
111111222222233333333
444444555555577777777
111111222222233333333 + 444444555555577777777 = 555555777777811111110