续生日相同问题~那代码就是AC不了~晕~
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。输入
第一行为整数n,表示有n个学生,n ≤ 180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。名字、月、日之间用一个空格分隔
输出
每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前到后的顺序输出。 对生日相同的名字,按名字从短到长按序输出,长度相同的按字典序输出。如没有生日相同的学生,输出”None”
样例输入
6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Lagrange 4 5
Bill 3 2
样例输出
3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange
自己做了一遍~但就是AC不了~弄了一个上午还是不知哪里出问题了~
正确代码很容易找到,但我就是想知道我那个是怎么回事~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
int month;
int day;
int flag;
char name[21];
}Node;
Node stu[180]={0};
int comp( const void *stu_a,const void *stu_b)
{
Node *a=(Node *)stu_a;
Node *b=(Node *)stu_b;
if (a->month<b->month)
return -1;
if (a->month>b->month)
return 1;
if (a->day<b->day)
return -1;
if (a->day>b->day)
return 1;
if (strlen(a->name)<strlen(b->name))
return -1;
if (strlen(a->name)>strlen(b->name))
return 1;
return strcmp(a->name,b->name);
}
void print(Node *stu)
{
static int flag=0;
static int month=0;
static int day=0;
if (flag==0)
printf ("%d %d",stu->month,stu->day);
else if (month!=stu->month&&day!=stu->day)
printf ("\n%d %d",stu->month,stu->day);
flag=1;
month=stu->month;
day=stu->day;
printf(" %s",stu->name);
}
int main()
{
int n=0;
int i=0;
int flag=0;
memset(stu,0,sizeof(stu));
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%s",stu[i].name);
scanf("%d",&stu[i].month);
scanf("%d",&stu[i].day);
}
qsort(stu,n,sizeof(stu[0]),comp);
for (i=1;i<n;i++)
{
if (stu[i-1].month==stu[i].month&&stu[i-1].day==stu[i].day)
{
stu[i-1].flag=1;
stu[i].flag=1;
flag=1;
}
}
for (i=0;i<n&&flag;i++)
if (stu[i].flag)
print(&stu[i]);
if (flag==0)
printf("None");
printf("\n");
return 0;
}
重酬啊
~~~~~后记----代码修改后(10楼)虽然AC了,但感觉那100分贴结得有点无语~明明是一个非常水的错误,怎么今天这么长时间也没有人看出问题来~~也许,今天含金量很高的高手不在@吹水佬@xzlxzl,导致自己发现那个错误后有点无语~如果是有点能耐的话可以先不看10楼改正的代码,看看能不能看出问题出来,如果真的没有人发现问题,那就真是非常无语的一件事情啦~~~~
[此贴子已经被作者于2017-2-8 00:43编辑过]





那些测试平台就是这样,好好的一个代码,有时就不让你过你怎么都过不了,那题过不了就算了。
~~~