本题考点:
1.数据量较大,需储存数据较多,使用机动战,输入一个数据处理一个数据
2.数据需分类的可能情况较多,分类繁琐(比较年,比较月,比较日)
3.可以考虑将年月日三个变量统一化为一个变量,类比于时分秒
举例说明:aaa 2000/02/28可以转化为2000*10^4+02*10^2+28
参考博客链接:PAT 1028人口普查的代码实现及错误分析(C语言)_bawangtu的博客-CSDN博客_pat1028人口普查c语言
测试点考察:0-一般案例 1&&2-边界条件 3-合理数为0 4-数据量较大(即发生超时)
#include<stdio.h>
#include<string.h>
int main() {
int y, m, d;
int n;
//这里要为6
char name[6] = { 0 };
scanf("%d", &n);
int k = 0;
int miny = 1814, minm = 1, mind = 1;
int maxy = 2014, maxm = 12, maxd = 31;
char name1[6] = { 0 }, name2[6] = { 0 };
while (n--) {
//这里也要为6,vs对程序保护措施严格,字符串字数大于等于5可能在dev能正常运行,而vs会产生少循环次数的bug
scanf("%s %d/%d/%d", name, &y, &m, &d);
//先处理年份为1814
if (y == 1814 && (m > 9 || (m == 9 && d >= 6))) {
//先求最大
if (maxy > y) {
maxy = y;
maxm = m;
maxd = d;
strcpy(name2, name);
}
else if (maxy == y) {
if (maxm > m) {
maxm = m;
strcpy(name2, name);
maxd = d;
}
else if (maxm == m) {
if (maxd > d) {
maxd = d;
strcpy(name2, name);
}
}
}
//再求最小
if (miny == y) {
if (minm < m) {
minm = m;
strcpy(name1, name);
mind = d;
}
else if (minm == m) {
if (mind < d) {
mind = d;
strcpy(name1, name);
}
}
}
}
//接着处理年份2014
if (y == 2014 && (m < 9 || (m == 9 && d <= 6))) {
//先求最大
if (maxy == y) {
if (maxm > m) {
maxm = m;
strcpy(name2, name);
mind = d;
}
else if (maxm == m) {
if (maxd > d) {
maxd = d;
strcpy(name2, name);
}
}
}
//再求最小
if (miny < y) {
miny = y;
minm = m;
mind = d;
strcpy(name1, name);
}
else if (miny == y) {
if (minm < m) {
minm = m;
strcpy(name1, name);
mind = d;
}
else if (minm == m) {
if (mind < d) {
mind = d;
strcpy(name1, name);
}
}
}
}
//计算一般情况
if (y > 1814 && y < 2014) {
//先处理最大
if (maxy > y) {
maxy = y;
strcpy(name2, name);
maxm = m;
maxd = d;
}
else if (maxy == y) {
if (maxm > m) {
maxm = m;
strcpy(name2, name);
maxd = d;
}
else if (maxm == m) {
if (maxd > d) {
maxd = d;
strcpy(name2, name);
}
}
}
//再处理最小
if (miny < y) {
miny = y;
strcpy(name1, name);
minm = m;
mind = d;
}
else if (miny == y) {
if (minm < m) {
minm = m;
strcpy(name1, name);
mind = d;
}
else if (minm == m) {
if (mind < d) {
mind = d;
strcpy(name1, name);
}
}
}
}
//计算合格次数
if (y < 2014 && y >1814) {
k++;
}
else if (y == 1814) {
if (m > 9) {
k++;
}
else if (m == 9) {
if (d >= 6) {
k++;
}
}
}
else if (y == 2014) {
if (m < 9) {
k++;
}
else if (m == 9 && d <= 6) {
k++;
}
}
}
if(k!=0){
printf("%d %s %s", k, name2, name1);
}
else{
printf("%d",k);
}
}
三种变量程序的运行时间,接下来将其与下面的三合一变量程序对比
详见引用链接