二——日期类问题

在这里插入图片描述

# include<iostream>
# include<stdio.h>
# include<stdlib.h>
using namespace std;

int monthNum[13][2] = {
    0,0,
    31,31,
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31
};

//判断平年闰年,平年返回0,闰年返回1
int judge(int year){
    if((year%400==0)||(year%4==0&&year%100!=0)){
        return 1;
    }
    return 0;
}

struct Date{
    int year;
    int month;
    int day;
    void nextDay(){
        day++;
        int k = judge(year);
        if(day>monthNum[month][k]){
            day = 1;
            month++;
            if(month>12){
                month=1;
                year++;
            }
        }

    }
};

//存储日期到0000年1月1日之间的间距
int distance1[5001][13][32];

void initDistance(){
    Date d;
    int dis = 0;
    d.year = 0;
    d.month = 1;
    d.day = 1;
    distance1[d.year][d.month][d.day] = dis;
    while(d.year<5001){
        d.nextDay();
        dis++;
        distance1[d.year][d.month][d.day] = dis;
    }
}

main(){
    int year1,month1,day1;
    int year2,month2,day2;
    int result;
    initDistance();
    while(scanf("%4d%2d%2d",&year1,&month1,&day1)!=EOF){
        scanf("%4d%2d%2d",&year2,&month2,&day2);
        result = abs(distance1[year1][month1][day1] - distance1[year2][month2][day2]) + 1;
        cout<<result<<endl;
    }

}

注:解决这类区间问题都有一个统一的思想——把原区间问题统一到起点确定的统一问题上去。
在这里插入图片描述

# include<iostream>
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
using namespace std;

char month[13][20] = {
    "",
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
};

char d[8][20]{
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday"
    "Friday",
    "Saturday"
};

int monthNum[13][2] = {
    0,0,
    31,31,
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31
};

//判断平年闰年,平年返回0,闰年返回1
int judge(int year){
    if((year%400==0)||(year%4==0&&year%100!=0)){
        return 1;
    }
    return 0;
}

struct Date{
    int year;
    int month;
    int day;
    void nextDay(){
        day++;
        int k = judge(year);
        if(day>monthNum[month][k]){
            day = 1;
            month++;
            if(month>12){
                month=1;
                year++;
            }
        }

    }
};

//存储日期到0000年1月1日之间的间距
int distance1[5001][13][32];

void initDistance(){
    Date d;
    int dis = 0;
    d.year = 0;
    d.month = 1;
    d.day = 1;
    distance1[d.year][d.month][d.day] = dis;
    while(d.year<5001){
        d.nextDay();
        dis++;
        distance1[d.year][d.month][d.day] = dis;
    }
}

main(){
    initDistance();
    int day,year;
    char m[20];
    int i;
    while(cin>>day>>m>>year){
        for(i = 0;i<=13;i++){
            if(strcmp(m,month[i])==0){
                break;
            }
        }
        int r = distance1[year][i][day] - distance1[2021][6][21];
        int today = 1;
        int days = today + r;
        int k = (days%7 + 7)%7;
        cout<<d[k]<<endl;

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值