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;
}
浙公网安备 33010602011771号