| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2953 人关注过本帖
标题:续生日相同问题~那代码就是AC不了~晕~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:100 回复次数:14 
续生日相同问题~那代码就是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编辑过]

搜索更多相关主题的帖子: 出生月 字符串 生日 字母 
2017-02-07 13:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
上机验证通过AC后的重酬~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-07 13:26
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:50 
程序无误。用你的测试用例完全正确。
2017-02-07 13:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 ICU
虽然我不知道为什呢AC不了,但我还是十分感谢你的回复那些测试平台就是这样,好好的一个代码,有时就不让你过你怎么都过不了,那题过不了就算了。

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-07 14:02
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

是,有时候程序正确就得考虑可能是阅卷的机器有怪癖
2017-02-07 14:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
发现问题了~问题在输出格式上面~

程序代码:
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);
}

感觉AC平台检查输出格式不是整体检查,而是分段检查~
 printf ("\n%d %d",stu->month,stu->day);
这样,把'\n'和后面的两个%d合在一起检查输出的正确性,这样当然难免会出问题啦~
虽然这只是个猜想,但感觉有这种可能,可能与输出格式检验机制有关~
而且这个我不是很想修改,平时代码过了就算啦~这么严格的输出限制感觉没啥意思~

还有个小问题,其实int comp( const void *stu_a,const void *stu_b)这行代码原帖把const 和void 的位置写反了,现已改正,不过改了AC结果照样不变~这个笑笑就算啦~

[此贴子已经被作者于2017-2-7 14:47编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-07 14:45
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:50 
楼主很较真也很严谨
2017-02-07 21:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
自己重做一遍,AC了~

原来是自己犯了一个非常隐秘的逻辑错误改一点点就行了~

这个是AC代码~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
    int month;
    int day;
    char name[20];
}Node;
int cmp(const void* aa,const void* bb)
{
    Node *a=(Node*)aa;
    Node *b=(Node*)bb;

    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);

}
int main()
{
    Node s[180]={0};

    int i=0;
    int n=0;
    int flag=-1;

    memset(s,0,sizeof(s));

    scanf("%d",&n);
    for (i=0;i!=n;++i)
        scanf("%s%d%d",s[i].name,&s[i].month,&s[i].day);

    qsort(s,n,sizeof(s[0]),cmp);

    for(i=0;i!=n;++i)
    {
        if (i!=n-1&&(s[i].month==s[i+1].month&&s[i].day==s[i+1].day)&&flag!=1)
        {
            printf("%d %d",s[i].month,s[i].day);
            flag=1;
        }

        if (flag==1)
            printf(" %s",s[i].name);

        if (i!=n-1&&(s[i].month!=s[i+1].month||s[i].day!=s[i+1].day)&&flag==1)
        {
            printf("\n");
            flag=0;
        }
    }

    if (flag==-1)
        printf("None\n");

    if (flag==1)
        printf("\n");

    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-07 23:59
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
夜猫子。。。
2017-02-08 00:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这个是一楼修改后的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;
        
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-08 00:02
快速回复:续生日相同问题~那代码就是AC不了~晕~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020731 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved