c语言,大数相加,求解释我写的为什么出错了?

#include<stdio.h>
#include<string.h>
int main(void)
{
void revers(char *x);
char a[1000]={'0'},b[1000]={'0'};
gets(a);
gets(b);
revers(a);
revers(b);

char x;
int i;
#include<stdio.h>
#include<string.h>
int main(void)
{
void revers(char *x);
char a[1000]={'0'},b[1000]={'0'};
gets(a);
gets(b);
revers(a);
revers(b);

int x;
int i;
for(i=0;i<strlen(a)&&i<strlen(b);i++) //a[]存放结果
{
x=a[i]+b[i];
if(x>=10)
{
a[i]=x%10;
a[i+1]+=1;
}
else a[i]=x;
}
if(strlen(a)<strlen(b))
{
for(i=strlen(a);i<strlen(b);i++,a[i]=b[i])
;
}
revers(a);
for(i=0;i<strlen(a);i++)
printf("%c",a[i]);

}
void revers(char *x)
{
int i,temp,len=strlen(x);
for(i=0;i<len/2;i++)
{
temp=x[i]; x[i]=x[len-1-i]; x[len-1-i]=temp;
}
}

    存在两个int main(void)、两个char a[1000]={'0'},b[1000]={'0'};,这肯定错。

    根据gets(a); gets(b);这样的输入,a、b中存放的是字符,每一个字符的编码都大于等于48,用>=10判断是否有进位显然是错误的。

    revers函数库里有,没有必要自定义一个,免得出错。

下面写一个供参考——

代码文本:

#include "stdio.h"

#include <string.h>

int main(int argc,char *argv[]){

char a[1000]="",b[1000]="";

int i,t,la,lb;

printf("Please enter the two positive integers...\n");

scanf("%999[0-9] %999[0-9]",a,b);//只允许输入数字且最大长度999

strrev(a);

strrev(b);

if((la=strlen(a))<(lb=strlen(b))){//长数作加数a,若a短则交换内容,避免用指针

for(i=0;i<la;t=a[i],a[i]=b[i],b[i]=t,i++);

for(a[i]=b[i],b[i++]='\0';a[i++]=b[i];);

t=la,la=lb,lb=t;

}

for(i=0;i<lb;i++)

if((a[i]+=b[i]-'0')>'9')//-'0'就变成了数字

a[i]-=10,a[i+1]++;//处理进位

for(;i<la;i++)//处理剩余部分进位

if(a[i]>'9')

a[i]-=10,a[i+1]++;

else//一旦无进位,前面就不会再有进位了

break;//前面就不会再有进位了

if(a[la])//最高位有进位的话处理一下

a[la]='1',a[la+1]='\0';

strrev(a);

printf("\nThe result is %s\n",a);

return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-19
注意:要大数相加,需要计算每位上的数字而不是数字的ASCII码相互加减,因此需要给a和b每位赋值0而不是'0'
另外:char a[1000]={'0'};仅是将a[0]赋值了'0'后面没有初始化,因此最好还是自己设计程序实现初始化,比如:for ( i=0;i<1000;i++ ) a[i]=0;