关于日期一些题目

个人觉得日期相关题目是有点烦的(基本上会用到结构体什么的,处理月份也好烦啊hhh),于是想特意整理一期

例题

打鱼晒网:


中国有句俗语:“三天打鱼两天晒网”,某人从2000年1月1日起开始“三天打鱼两天晒网”,打鱼和晒网是连续进行的。
问这个人在以后的某一天是在“打鱼”还是在“晒网”?
用下面结构体表述日期:
struct Date{
   int year;
   int month;
   int day;
};
Input:
2000-11-3
Output:
打鱼
Input:
2000-2-29
Output:
晒网

这题也是很经典了。。。

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    int year;
    int month;
    int day;
};
//判断某一年是否为闰年
int isRunNian(int year)
{
    if((year%4==0&&year%100!=0)||year%400==0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
//计算日期与起始日期之间的天数差
int JiSuanDays(struct Date date,struct Date startDate)
{
    int days=0;
    //计算整年的天数差
    for(int i=startDate.year;i<date.year;i++)
    {
        days+=isRunNian(i)?366:365;
        /*
        //等价于下面的语句
        if(isRunNian(i))
        {
          days+=366;
        }
        else
        {days+=365;}
        */
    }
    //计算当年的天数差
    for(int i=1;i<date.month;i++)
    {
        if(i==2)
        {
            days+=isRunNian(date.year)?29:28;
        }
        else if(i==4||i==6||i==9||i==11)
        {
            days+=30;
        }
        else
        {
            days+=31;
        }
    }
    days+=date.day-1;
    /*将目标日期的日数减去1(因为计算天数差时是从0开始算的),
    然后累加到 days 变量中
    这样days 就代表了从起始日期到目标日期的总天数*/
    return days;
}
int main()
{
    struct Date date;
    struct Date startDate={2000,1,1};
    scanf("%d-%d-%d",&(date.year),&(date.month),&(date.day));
    int days=JiSuanDays(date,startDate);
    if(days%5<3)
    {
        printf("打鱼\n");
    }
    else
    {
        printf("晒网\n");
    }
    return 0;
}

林大oj 414 第几天?


Description
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有1组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
1985/1/20
Sample Output
20
 

#include<bits/stdc++.h>
using namespace std;
int fun(int a)
{
    if ((a% 4 == 0 && a% 100 != 0) ||a% 400 == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    int a, b,c;
    scanf("%d/%d/%d", &a, &b, &c);
    int Month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int sumDays = c;
    for (int i = 1;i<b; i++)
    {
        sumDays+= Month[i - 1];//Month[0] 是1月的天数,数组下标从0开始
    }

    if (fun(a) ==1&& b> 2)
    {
        sumDays += 1;
        /*如果输入年份 a 是闰年(fun(a) == 1)
        且输入月份 b 大于2(即在3月及以后),
        则将总天数 sumDays 加一,因为闰年的2月份多一天*/
    }
    printf("%d\n",sumDays);
    return 0;
}

 林大oj 233 生日日期

Description
    小甜甜的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。
Input
多组输入
每组包含YY,MM,DD其中1949<=YY<=2002,日期绝对合法。
Output
每组输出只有一行,即小甜甜生日第一万天以后的日期,格式为 “YY-MM-DD”。
Sample Input
1975 7 15
Sample Output
2002-11-30

#include<bits/stdc++.h>
using namespace std;
int fun(int n)
{ //判断闰年
    if ((n%4==0&&n%100!=0)||n%400==0)
        return 1;
    return 0;
}
int Month(int n,int y) { //判断月份天数
    int num=0;
    if(n==1||n==3||n==5||n==7||n==8||n==10||n== 12)
        num=31;
    if(n==4||n==6||n==11||n==9)
        num += 30;
    if(fun(y)==1&&n==2)
        num = 29;
    else if (fun(y)==0&&n==2)
    num = 28;
    return num;
}
int main()
{
    int y=0,m=0,d=0;
    int n=10000;
    while(scanf("%d%d%d", &y, &m, &d) != -1)
    {
        for (int i=1;i<=n;i++)
        {
            d++;
            if(d>Month(m,y))
            {
                d-=Month(m, y);
                m++;//月份更新
                if(m>12)
                {
                    m=1;
                    y++;//年份更新
                }
            }
        }
        printf("%d-%d-%d\n", y, m, d);
    }
    return 0;
}

林大oj 2068 出生日期

Description
班主任想统计大一同学的出生日期,并想按照同学的如期从大到小进行排序。可是班主任最近科研任务很重,时间不够,所以请你帮帮他。
Input
有2行,
第1行为学生总人数n;
第2行至第n+1行分别是同学的姓名s、出生年y、月m、日d。
Output
输出n行,
为从大到小同学的姓名。(注:如果有两个同学生日相同,输入靠后的同学先输出)
Sample Input
3
LiYanhu 1992 4 23
Qiujbojun 1993 10 13
Lixunhuan 1991 8 1
Sample Output
Lixunhuan
LiYanghu
Qiubojun

#include <bits/stdc++.h>
using namespace std;
struct Date
{
    string name;
    int y,m,d,id;
}p[1005];
bool cmp(Date a,Date b)
{
    if(a.y!=b.y)
        return a.y<b.y;
    else if(a.m!=b.m)
        return a.m<b.m;
    else if(a.d!=b.d)
        return a.d<b.d;
    return a.id>b.id;
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            p[i].id=i+1;
            cin>>p[i].name>>p[i].y>>p[i].m>>p[i].d;
        }
        sort(p,p+n,cmp);
        for(int i=0;i<n;i++)
        cout<<p[i].name<<endl;
    }
    return 0;
}

这里用到了sort排序,可以看我之前发的博客

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值