PTA1028 人口普查 (20 分)

在这里插入图片描述

//测试点3,合理的年龄为0时,不加空格
//测试点4,比较年龄时,可能会导致超时,将数据存储为string类型直接比较
//测试点2测边界值的又出了问题,不晓得。。。
#include<stdio.h>
#define N 100000
struct people
{
    char name[6];
    int year;
    int month;
    int day;
};
void swap(struct people *a,struct people *b);
void main()
{
    struct people num[N];
    struct people *s[N];
    int i=-1,t,n,j;
    scanf("%d",&n);
    for(t=0;t<n;t++){
        i++;
        s[t]=&num[t];
        scanf("%s%d/%d/%d",s[i]->name,&s[i]->year,&s[i]->month,&s[i]->day);
        if(s[i]->year>2014){
            i--;continue;
        }else{
            if(s[i]->year==2014){
                if(s[i]->month>9){
                    i--;continue;
                }else{
                    if(s[i]->month==9){
                        if(s[i]->day>6){
                            i--;continue;
                        }
                    }
                }
            }
        }
        if(s[i]->year<1814){
            i--;continue;
        }else{
            if(s[i]->year==1814){
                if(s[i]->month<9){
                    i--;continue;
                }else{
                    if(s[i]->month==9){
                        if(s[i]->day<6){
                            i--;continue;
                        }
                    }
                }
            }
        }
    }
    printf("%d",i+1);
    n=i+1;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(s[i]->year>s[j]->year){
                swap(s[i],s[j]);
            }
            if(s[i]->year==s[j]->year){
                if(s[i]->month>s[j]->month){
                    swap(s[i],s[j]);
                }
                if(s[i]->month==s[j]->month){
                    if(s[i]->day>s[j]->day){
                        swap(s[i],s[j]);
                    }
                }
            }
        }
    }
    if(n>=2){
        printf(" %s %s\n",s[0]->name,s[n-1]->name);
    }else{
        if(n==1){
            printf(" %s\n",s[0]->name);
        }
    }
}
void swap(struct people *a,struct people *b)
{
    struct people item;
    item=*a;
    *a=*b;
    *b=item;
}
//对测试点4进行修改,用字符串进行比较,同时优化程序
#include<stdio.h>
#include<string.h>

int main()
{
	int N,i,count=0;
	char inform[17],eldest[17]={'9'},youngest[17]={'0'};//'0''9'的作用是为最开始的比较 
	scanf("%d",&N);
	for(i=0;i<N;i++){
		scanf("%s %s",inform+11,inform);//将名字放到后面,新信息放到前面方便比较,非常巧妙 
		if(strcmp(inform,"1814/09/06")>=0&&strcmp(inform,"2014/09/06")<=0){
			if(strcmp(inform,eldest)<=0){
				memcpy(eldest,inform,17);
			}
			if(strcmp(inform,youngest)>=0){
				memcpy(youngest,inform,17);
			}
			count++;
		}
	}
	if(count){
		printf("%d %s %s\n",count,eldest+11,youngest+11);
	}else{
		printf("0\n");
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值