hdu2034为什么总是WA
#include<stdio.h>#include<stdlib.h>intmain(){intn,m,i,a[101],b[101],j,c[100]={0},t,k,...
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,m,i,a[101],b[101],j,c[100]={0},t,k,d;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{ for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<m;j++)
scanf("%d",&b[j]);
k=0;d=0;
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{if(a[i]==b[j])
break;
else
{
k++;
if(k==m)
{c[d]=a[i];
d++;}}}
k=0;}
if(d==0)
printf("NULL\n");
else
{
for(i=0;i<d;i++)
{for(j=0;j<d-1-i;j++)
if(c[i]>c[i+1])
{
t=c[i+1];
c[i+1]=c[i];
c[i]=t;
}
printf("%d ",c[i]);
}
printf("\n");}
}
return 0;
} 展开
#include<stdlib.h>
int main()
{
int n,m,i,a[101],b[101],j,c[100]={0},t,k,d;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{ for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<m;j++)
scanf("%d",&b[j]);
k=0;d=0;
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{if(a[i]==b[j])
break;
else
{
k++;
if(k==m)
{c[d]=a[i];
d++;}}}
k=0;}
if(d==0)
printf("NULL\n");
else
{
for(i=0;i<d;i++)
{for(j=0;j<d-1-i;j++)
if(c[i]>c[i+1])
{
t=c[i+1];
c[i+1]=c[i];
c[i]=t;
}
printf("%d ",c[i]);
}
printf("\n");}
}
return 0;
} 展开
展开全部
额。。貌似你的算法有问题,如果先核对后排序的话可能会造成一个集合中有些数字没有被核对到,最终导致结果错误,如:假设A={2,4,1,7},B={2,1};
在for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{if(a[i]==b[j])
break;
else
{
k++;
if(k==m)
{c[d]=a[i];
d++;}}}
k=0;}这一段语句中,当i=0时,a[i]==b[j]成立,跳出里面的循环,k为1,此时k不等于m,i自加1,当i为2,j为1时,a[i]==b[j],满足k==m,复制数组a在i以后的内容,但是,最终会发现,少了一个元素4,只得到一个元素7.显然答案错误。。所以应该首先排序,再核对。
这是我的代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t,i,j,k,temp,m,n;int a[120],b[120],s[120];
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));//初始化
k=0;
if(n==0&&m==0)break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<n-1;i++)//排序
for(j=i+1;j<n;j++)
{
if(a[j]<a[j-1])
{temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;}
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(b[j]<b[j-1])
{temp=b[j];
b[j]=b[j-1];
b[j-1]=temp;}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if(a[i]==b[j]) break;
if(j>=m)
{s[k]=a[i];k++;}
}
if(!k)printf("NULL\n");
else
{for(i=0;i<k;i++)
printf("%d ",s[i]);
printf("\n");}
}
return 0;
}
在for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{if(a[i]==b[j])
break;
else
{
k++;
if(k==m)
{c[d]=a[i];
d++;}}}
k=0;}这一段语句中,当i=0时,a[i]==b[j]成立,跳出里面的循环,k为1,此时k不等于m,i自加1,当i为2,j为1时,a[i]==b[j],满足k==m,复制数组a在i以后的内容,但是,最终会发现,少了一个元素4,只得到一个元素7.显然答案错误。。所以应该首先排序,再核对。
这是我的代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t,i,j,k,temp,m,n;int a[120],b[120],s[120];
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));//初始化
k=0;
if(n==0&&m==0)break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<n-1;i++)//排序
for(j=i+1;j<n;j++)
{
if(a[j]<a[j-1])
{temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;}
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(b[j]<b[j-1])
{temp=b[j];
b[j]=b[j-1];
b[j-1]=temp;}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if(a[i]==b[j]) break;
if(j>=m)
{s[k]=a[i];k++;}
}
if(!k)printf("NULL\n");
else
{for(i=0;i<k;i++)
printf("%d ",s[i]);
printf("\n");}
}
return 0;
}
追问
汗~~发现错误了,是我的想法不对。少考虑个细节。。。。
追答
呵呵,发现了错误就好,这样才记得更深刻啊
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询