续生日相同问题~那代码就是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编辑过]