PAT 1028 人口普查

题目:

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

思路:通过string对象保存生日并计算出相应生日的ASCII值(计算过程中要对每一个字符的ASCII的值进行按位加权确保唯一性),通过与作为边界的生日的ASCII值对比来筛选出符合条件的

          生日,最后再遍历找出题目所求的答案。

代码:

#include<iostream>
#include<string>
using namespace std;
struct familyCensus
{
	string name;
	string birthday;
	double sum;
}fc[100000];
int main()
{
	int N = 0;
	cin >> N;
	if (N > 100000 || N < 0)return 0;
	string yearnow = "2014/09/06";
	string sideyear = "1814/09/06";
	 double side1 = 0, side2 = 0;//保存题目所给的两个年份的ASCII值
	for (int i = 0; i < N; i++)
	{
		cin >> fc[i].name >> fc[i].birthday;
		fc[i].sum = 0;
	}
	for (int i = 0; i < yearnow.size(); i++)
	{
		side1 *= 10;
		side2 *= 10;
		side1 =side1+(wchar_t)yearnow[i] - '/';
		side2 =side2+(wchar_t)sideyear[i] - '/';//计算题目所给的ASCII值,按位进行加权能保证所得的值有唯一性
	}
	
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < fc[i].birthday.size(); j++)//对所给数据的ASCII值进行加权
		{
			fc[i].sum *= 10;
			fc[i].sum =fc[i].sum+(wchar_t)fc[i].birthday[j] - '/';//会出现算数移除的警告,故进行强制转换
		}
		//cout << fc[i].sum << " ";
	}
	double max = 0, min = side1;
	int indexmax = 0, indexmin = 0;
	int step = 0;
	for (int j=0;j<N;j++)
	{
		if (fc[j].sum>=side2&&fc[j].sum<=side1)
		{
			//通过筛选在边界内的出生日期选出年龄最大和最小的年龄的位置
			if (max < fc[j].sum)
			{
				max = fc[j].sum;
				indexmax = j;
			}
			 if (min>fc[j].sum)
			{
				min = fc[j].sum;
				indexmin = j;
			}
			 step++;
		}
	}
	if (step == 0)cout << step;//测试点3:一个合适的都没有,输出0;
	else
	cout << step<<" "<<fc[indexmin].name << " " << fc[indexmax].name;
	return 0;
}
原文地址:https://www.cnblogs.com/zongji/p/12403728.html