题目:
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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; }