PAT1028 人口普查 测试点分析及两种写法

本题考点:

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

 三种变量程序的运行时间,接下来将其与下面的三合一变量程序对比

详见引用链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值