描述:在有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;
}
一种方式是定义一个数组,每出现一个新生日的,则数组元素增加一个。如果有重复生日的,则生日人数增加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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!