1028 人口普查 (20 分)


原题

https://pintia.cn/problem-sets/994805260223102976/problems/994805293282607104

思路

注意点:
1、闭区间,生日可以等于"1814/09/06"和"2014/09/06"
2、有效生日个数为0时,只输出0

思路:
1、虽然每个月份的天数不一样但不需要,计算具体的天数,只要比较大小即可。
本来想按20010512整型比较,但柳大佬提供更好的比较方式,string类型运算符直接比较大小。(不清楚什么原理,大概是依次比较的单个字符。顺带提一句,java的compareTo)
2、因为不需要输出每个人的对应生日,用两个变量记录最大年龄和最小年龄即可。

扩展知识点:
也可以使用C标准库#include 中的strcmp()函数(用于字符串比较)。该函数通过比较运算符来比较字符串,就像比较数字一样。如果两个字符串参数相同,该函数就返回0,否则左>右返回1,左<右返回-1。

代码

学到知识点:
现在的C允许把一个结构赋值给另一个结构,但是数组不能这样做。也就是说,如果n_data和o_data都是相同类型的结构,可以这样做:

o_data = n_data; // 把一个结构赋值给另一个结构
#include 
#include 
using namespace std;

struct Person{
    char name[6];
    char birth[11];
}p;

int main()
{
    int num,cnt=0;
    cin >> num;
    struct Person maxBirth ={"","1814/09/06"} ;
    struct Person minBirth = {"","2014/09/06"};
    
    for (int i = 0; i < num; i++)
    {
        scanf("%s %s",p.name,p.birth);
        if(strcmp(p.birth,"1814/09/06")>=0&&strcmp(p.birth,"2014/09/06")<=0)//闭区间
        {
            cnt++;
            if(strcmp(p.birth,maxBirth.birth)>=0) maxBirth=p;//现在的C允许把一个结构赋值给另一个结构            
            if(strcmp(p.birth,minBirth.birth)<=0) minBirth=p;
        }
    }
    cout<

以下大佬代码

#include 
using namespace std;

int main(void)
{
    int n, cnt = 0;
    string name, birth, maxname, minname, maxbirth = "1814/09/06", minbirth = "2014/09/06";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> name >> birth;
        if (birth >= "1814/09/06" && birth <= "2014/09/06")//闭区间
        {
            cnt++;
            if (birth >= maxbirth){
                maxbirth = birth;
                maxname=name;
                }
            if (birth <= minbirth){
                minbirth = birth;
                minname=name;
                }
        }
    }
    cout<