PTA |1028 人口普查 分数 20 格式坑点

117 阅读2分钟

PTA | 程序设计类实验辅助教学平台 (pintia.cn)

用公式表示为:birth=year×10000+month×100+day

image.png

C语言写法

#include<iostream>
#include<cstring>
using namespace std;

typedef long long LL;
int main()
{
    int n=0;cin>>n;
    int year,month,day;
    
    LL max_age=20140906,min_age=18140906;

    int valid_count=0;
    char name[6] ,max_name[6],min_name[6];//名字用字符数组存,名字最长6个字符(题目有说)

    
    for(int i=0;i<n;i++)
    {
        scanf("%s %d/%d/%d",&name,&year,&month,&day);

        LL birth=year*10000+month*100+day;

        if(birth<18140906 || birth>20140906);//非法日期,什么也不做
        else
        {
            valid_count++;
            //合法日期,开始求
            if(birth<max_age)  //找出最小的,最小的数即年龄最大的
            {
                //strcpy,后面的存到前面的,name存到max_name
                strcpy(max_name,name);  //max_name维护最大年龄姓名
                max_age=birth;  //max_age维护最大年龄
            }
            if(birth>min_age)
            {
                //更新为最小的
                strcpy(min_name,name);   //min_age维护最小年龄姓名
                min_age=birth;   //min_age维护年龄
            }
            
        }
    }

    if(valid_count)
    printf("%d %s %s\n",valid_count,max_name,min_name);
    else
    printf("0\n");//这个点容易漏,即输入的都是不合理的数据
    
    return 0;
}

其实一个日期就八位数,没有超过int类型,不用开long longh,只不过我的birthday放到里面了,每次都没有清空,就加下一个日期了,所以开的long long。可以在外面用int声明一下就不用开long long了。

C++写法

#include<bits/stdc++.h>
using namespace std;
int cnt;
int main()
{
    int n = 0; cin >> n;
    string name,bir;
    string max_name,min_name;
    string maxbirday = "20140906", minbirday = "18140906";

    for(int i=0;i<n;i++)
    {
        cin>>name>>bir;

        //提取一下日期(因为有/ / /)
        string temp;
        for(int j=0;j<bir.size();j++)
        {
            if(bir[j]>='0'&&bir[j]<='9')temp+=bir[j];
        }
        if(temp>"20140906"||temp<"18140906")
    
            continue;
         cnt++;
        if(temp>minbirday)minbirday=temp,min_name=name;
        if(temp<maxbirday)maxbirday=temp,max_name=name;
            
        
     
    }
if(cnt){
    cout<<cnt;
    cout<<" "<<max_name<<" "<<min_name<<endl;
}
    else cout<<"0\n";
    return 0;
}

三刷

通过了19分:

#include<bits/stdc++.h>
using namespace std;
int cnt;
string id;
string bir;
string temp;

int main()
{
    int n; cin >> n;
    int min_age = 18140906, max_age = 20140906;
    string max_id, min_id;
    for (int i = 0; i < n; i++)
    {
        temp.clear();

        string s;

        cin >> id >> bir;

        //提取一下日期
        for (int i = 0; i < bir.size(); i++)
        {
            if (isdigit(bir[i]))temp += bir[i];
        }

        //cout << temp << endl;


        //找出有效生日
        int age = stoi(temp);
        if (age >= 18140906 && age <= 20140906)
        {
            cnt++;
            //最小的
            if (age > min_age)
            {
                min_age = age;
                min_id = id;
            }
            if (age < max_age)
            {
                max_age = age;
                max_id = id;
            }
        }
    }

 
    cout << cnt << " " << max_id << " " << min_id << endl;


    return 0;
}

image.png

这个格式错误是即使有效个数是0也要把0给输出出来,这个特写一下就通过了:

image.png