生日相同:在有180人的大班级中

描述:在有180人的大班级中,存在两个人生日相同的概率非常大,现在给出每个学生的名字,出生月日。试找出所有生日相同的学生。
输入:第一行为整数呢,表示有n个学生,此后每行包含一个字符串和两个整数,分别表示学生的名字和出生年月,中间有空格
输出:对所有的输出按照日期从前到后,对生日相同的名字,按名字从短到长输出,长度相同的按字典顺序输出,没有生日相同的学生,输出“None”
样例:
6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Langrange 4 5
Bill 3 2
输出
3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange

#include<stdio.h>
#include<string.h>
struct stuent{
    char name[100];
    int birth[2];
}stu[200];
struct stuent tmp;
int main(){
    int i,j,k;
    int n;
    int flag=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s",stu[i].name);
        scanf("%d%d",&stu[i].birth[0],&stu[i].birth[1]);
    }   
    for(i=0;i<n;i++){
        for(j=n-1;j>i;j--){
            if(strlen(stu[j].name)<strlen(stu[j-1].name)){
                tmp=stu[j];
                stu[j]=stu[j-1];
                stu[j-1]=tmp; 
            }
            else if(strlen(stu[j].name)==strlen(stu[j-1].name)&&strcmp(stu[j].name,stu[j-1].name)<0){
                tmp=stu[j];
                stu[j]=stu[j-1];
                stu[j-1]=tmp; 
            }            
        }
    }
    for(i=0;i<n;i++){
        for(j=n-1;j>i;j--){
            if(stu[j].birth[0]<stu[j-1].birth[0]){
                 tmp=stu[j];
                stu[j]=stu[j-1];
                stu[j-1]=tmp; 
            }
            else if(stu[j].birth[0]==stu[j-1].birth[0]&&stu[j].birth[1]<stu[j-1].birth[1]){
                tmp=stu[j];
                stu[j]=stu[j-1];
                stu[j-1]=tmp;
            }       
        }
    }
    for(i=0;i<n;i=j){       
        for(j=i+1;j<n;j++){
            if(stu[i].birth[0]==stu[j].birth[0]&&stu[i].birth[1]==stu[j].birth[1])
              ;
            else break;
        }
        if((j-i)>1){flag=1;
          printf("%d %d ",stu[i].birth[0],stu[i].birth[1]);
        for(k=i;k<j;k++) printf("%s ",stu[k].name);
        printf("\n");  
        }
        
    }
    if(!flag) printf("None");
    return  0;
}

img

一种方式是定义一个数组,每出现一个新生日的,则数组元素增加一个。如果有重复生日的,则生日人数增加1个
或者定义一个二维数组,表示月和日,值表示人数即可

#include <stdio.h>
#include <string.h>
typedef struct _STU
{
    char **name;
    int num;
}STU;

void sortname(char **name,int n)
{
    int i,j;
    char t[20];
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(strlen(name[j]) > strlen(name[j+1]) || (strlen(name[j]) == strlen(name[j+1]) && strcmp(name[j],name[j+1])> 0))
            {
                strcpy(t,name[j]);
                strcpy(name[j],name[j+1]);
                strcpy(name[j+1],t);
            }
        }
    }
}

int main()
{
    STU stu[12][31];
    int i,j,k,n,y,m,count=  0;
    char name[20];
    for(i=0;i<12;i++)
        for(j=0;j<31;j++)
        {
            stu[i][j].name = (char**)malloc(180*sizeof(char*));
            for(k=0;k<180;k++)
                stu[i][j].name[k] = (char*)malloc(20*sizeof(char));
            stu[i][j].num = 0;
        }
    //
    scanf("%d",&n);
    for(k=0;k<n;k++)
    {
        scanf("%s%d%d",name,&y,&m);
        strcpy(stu[y-1][m-1].name[stu[y-1][m-1].num],name);
        stu[y-1][m-1].num++;
    }
    for(i=0;i<12;i++)
        for(j=0;j<31;j++)
        {
            if(stu[i][j].num > 0)
                sortname(stu[i][j].name,stu[i][j].num);
            if(stu[i][j].num > 1)
                count++;
        }
    for(i=0;i<12;i++)
        for(j=0;j<31;j++)
        {
            if(stu[i][j].num > 0)
                printf("%d %d",i+1,j+1);
            for(k=0;k<stu[i][j].num;k++)
                printf(" %s",stu[i][j].name[k]);
            if(stu[i][j].num > 0)
                printf("\n");
        }
        if(count == 0)
            printf("None");
        return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632