发布网友 发布时间:1天前
共2个回答
热心网友 时间:1天前
没注释,看的我晕头转向的。。。不过还是改好了,50分太少了,费了这么长时间,怎么也得给我加点分。。。
首先楼主对题目的理解有点问题。题目中的输入只有一个T,这个T代表后面的测试数据组数,每组有两个值进行相加。楼主理解成了这个T可能输入多组了,所以写了个while(cin>>T),其实这样是错的。
然后楼主有多处小错误,我在程序中已经标注了,经过我在hdoj上面的提交结果,我改过的程序可以AC!
//////////////////////////////////////////////////////////
#include <iostream>
#include <string>
using namespace std;
void add(char *a,char *b)
{
char c[1003]; //考虑到可能最后有进位,最好数组开1000+3以上,我一般开max+5
int al=strlen(a)-1,bl=strlen(b)-1,cw=0; //注意此处,后面循环计数时,al和bl应该从strlen(a)-1和strlen(b)-1开始,你这里没有减一。
for(int i=0;al!=-1&&bl!=-1;al--,bl--,i++)
{
if((c[i]=a[al]+b[bl]+cw-48)>=58)
{
c[i]-=10; cw=1;
}
else cw=0;
}
if(al==-1&&bl==-1);
else if(al==-1)
for(;bl!=-1;i++,bl--)
{
if((c[i]=b[bl]+cw)>=58)
{
c[i]-=10; cw=1;
}
else cw=0;
}
else if(bl==-1)
for(;al!=-1;i++,al--)
{
if((c[i]=a[al]+cw)>=58)
{
c[i]-=10; cw=1;
}
else cw=0;
}
if(cw==1) c[i++]=cw+48;
for(;i-1>=0;i--) cout<<c[i-1];
cout<<endl;
}
int main()
{
int T;
char a[20][1003],b[20][1003];
//while(cin>>T) //这里是楼主理解错了,T只会读入一次!并不用循环,循环的话程序不会结束,显然是错的。
// {
cin>>T;
//if(T>20||T<0) break; //既然不用循环就不用break,另外,题目说过T的范围在0到20之间就不会错的,不用多加判断!不用怀疑测试数据~
for(int j=0;j<T;j++)
{
scanf("%s%s",a[j],b[j]);
// if(strlen(a[j])>1000||strlen(b[j])>1000) //break;
}
for(j=0;j<T;j++)
{
if(j > 0) cout<<endl; //注意这里,第一行前面没有空格,否则会出现PE,也就是表达是错误!
cout<<"Case "<<j+1<<":"<<endl;
cout<<a[j]<<" + "<<b[j]<<" = ";
add(a[j],b[j]);
}
// }
return 0;
}
热心网友 时间:1天前
我不知道你还有没有别的错误,但是格式不对,结果输出完了后竟然还能输入数字,补充:你还是先做从10开始的后面八个题