一道A+B的C语言程序。(ACM)
上面是题目,
下面是我写的代码,思路大体应该是对的,但是不能运行,请高手帮助。
#include <stdio.h>
#include <string.h>
#define N 1000
int main ()
{
char ADD(char x[N],char y[N]);
char a[N],b[N],c[N];
int T,i;
scanf("%d",&T);
{
for(i=0;i<T;i++)
{
memset(a,'0',sizeof(a));
memset(b,'0',sizeof(b));
memset(c,'0',sizeof(c));
scanf("%s%s",&a,&b);
printf("Case %d:\n",i+1);
c[N]=ADD(a[N],b[N]);
printf("%s + %s = %s\n",a,b,c);
}
}
return 0;
}
char ADD(char x[N],char y[N])
{
int l1=0;
int l2=0;
int l3=0;
char z[N];
int j;
l1=strlen(x[N]);
l2=strlen(y[N]);
if(l1>l2)
l3=l1;
else l3=l2;
for(j=0;j<l1;j++)
{
x[j]=x[l1-j-1]-'0';
}
for(j=0;j<l2;j++)
{
y[j]=y[l2-j-1]-'0';
}
for(j=0;j<l3;j++)
{
z[j]=x[j]+y[j];
if(z[j]>=10)
{
z[j]=z[j]-10;
z[j+1]=z[j+1]+1;
}
z[j]=z[l3-j-1];
}
return z;
} 展开
#include <stdio.h>
#include <string.h>
#define N 1000
int main ()
{
void myadd1(char *x,char *y,char *z);
char a[N]="elpmaS",b[N],c[N+1];
int T,i,j,k;
strcpy(b,a);
printf("strrev(\"%s\")=\"%s\"\n",b,strrev(a));
scanf("%d",&T);
for(i=0;i<T;i++)
{memset(c,'0',1);
scanf("%s%s",a,b);
printf("Case %d:\n",i+1);
myadd1(a,b,c);
if(strlen(a)>strlen(b))j=strlen(a);else j=strlen(b);
printf(" %*s\n+%*s\n",j,a,j,b);
for(k=0;k<=75;k++)printf("-");printf("\n");
printf("%*s\n",j+1,c); /*连续三行printf()用于格式化输出 只是为了好看 可删*/
printf("%s + %s = %s\n",a,b,c);
}
scanf("%d"); /*暂停 看输出用*/
}
void myadd1(char *x,char *y,char *z)
{
int l1,l2,l3,j,jw=0; /*jw 进位标记*/
char *temp;
l1=strlen(x); l2=strlen(y); /*串反转*/
if(l1>l2) {temp=x;x=y;y=temp;l3=l1;l1=l2;l2=l3;} /*串x放短,串y放长*/
strrev(x); strrev(y);
for(j=0;j<l1;j++) /*短串相加*/
{z[j]=x[j]+y[j]-'0'-'0'+jw;
if(z[j]>=10){z[j]=z[j]-10;jw=1;}
else jw=0;
z[j]=z[j]+'0';
}
for(j=l1;j<l2;j++) /*余部*/
{z[j]=y[j]-'0'+jw;
if(z[j]>=10){z[j]=z[j]-10;jw=1;}
else jw=0;
z[j]=z[j]+'0';
}
if(jw==1){z[l2]='1';z[l2+1]='\0';}
else z[l2]='\0'; /*如果最后还有进位,直接补1*/
strrev(x); strrev(y); strrev(z); /*串反转*/
}
#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
typedef int llong[1000];
using namespace std;
void input(llong &a)
{
string s;
int len;
memset(a,0,sizeof(a));
cin>>s;
len=s.size();
for(int i=len;i>=1;i--)
a[i]=s[len-i]-'0';
a[0]=len;
}
void output(llong a)
{
for(int i=a[0];i>=1;i--)
printf("%d",a[i]);
}
void add_llong(llong a,llong b,llong &c)
{
llong tmp;
memset(tmp,0,sizeof(tmp));
int len=a[0]>b[0]?a[0]:b[0];
for(int i=1;i<=len;i++)
tmp[i]=a[i]+b[i];
len++;
for(int i=1;i<=len;i++)
if(tmp[i]>9) tmp[i+1]++,tmp[i]-=10;
while(tmp[len]==0&&len>1) len--;
tmp[0]=len;
memcpy(c,tmp,sizeof(c));
}
int main()
{
int t,i=1;
llong a,b,c;
scanf("%d",&t);
while(t--)
{
input(a);
input(b);
printf("Case %d:\n",i++);
output(a);
printf(" + ");
output(b);
printf(" = ");
add_llong(a,b,c);
output(c);
putchar('\n');
if(t) putchar('\n');
}
return 0;
}
先让c字符串都是0,
c[i+1]+=(a[i]+b[i])%10;
算法就是这样,很简答,
看不懂,我可以发你代码。
#include <stdio.h>
#include <string.h>
#define N 1000
void add(char z[],char x[],char y[])
{
int l1,l2,l3;
l1 = strlen(x);
l2 = strlen(y);
if(l1>l2) l3 = l1;
else l3 = l2;
strrev(x);//反转字符串
strrev(y);
for(int j=0;j<l3;j++)
{
z[j]=z[j]%48+x[j]%48+y[j]%48+'0';
if(z[j]>'9')
{
z[j] = z[j]-10;
z[j+1] = z[j+1]+49;
}
}
strrev(z);
strrev(x);
strrev(y);
}
int main ()
{
char a[N],b[N],c[N];
int T;
FILE *fp;
fp = fopen("in.txt","r");//输入文件,保存在同文件夹下
if(!fp)
{
printf("cannot open file in.txt");
return 0;
}
fscanf(fp,"%d",&T);
for(int i=0;i<T;i++)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
fscanf(fp,"%s\t%s",a,b);
add(c,a,b);
printf("Case %d:\n",i+1);
printf("%s + %s = %s\n",a,b,c);
}
fclose(fp);
return 0;
}
修改了一下,见拙了。