日期类问题---今天是周几以及今天是今年的第几天~

OK,刷题继续,这次是日期类问题。

首先明确:闰年是年份能被4整除且不能被100整除  或者 能被400整除的年份。

第一个题:

            输入年、月、日,计算该天是本年的第几天。

                                                                    ---来源牛客网

        输入描述:

        包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)

        输入:

        1990 9 20
        2000 5 1
    输出:
        263
        122

            解题思路:判断是否是闰年,之后根据月份来计算天数。

 代码:

#include<iostream>
using namespace std;
 
int main()
{
    int year,month,day;
    while(cin>>year>>month>>day)
    {
        int Month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
        int number = 0;
        if(( (year%4==0) && (year%100!=0) ) || (year%400==0))//闰年
        {
            Month[2] = Month[2] + 1;
        }
 
        for(int i = 1; i < month; i++)
        {
            number += Month[i];
        }
        number += day;
        cout<<number<<endl;
 
    }
}

第二个题:

            输入日期,判断当前是星期几

                                            -----来源王道考研机试指南

        输入:

            9 October 2001

            14 October 2001

        输出:

            Tuesday

            Sunday

        解题思路:计算输入日期与当前日期的天数差,然后根据当前的星期数,计算得到输入日期的星期数。天数差可以提前计算得到,以一个自己指定的日期为基数。分别计算两个日期与基数的差,然后就可以得到两个 日期的天数差。

#include<stdio.h>
#include<string.h>

#define YEAP(x) x%400 == 0|| x%100!=0 && x%4==0?1:0//闰年为1,非闰年为0
using namespace std;

int DayOfMonth[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
};

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

char NameOfWeekday[7][20]={
    "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};
struct Date{
    int Day;
    int Month;
    int Year;

    void Next_Day()
    {
        Day++;
        if(Day > DayOfMonth[Month][YEAP(Year)])//判断天数是否大于当前月的天数,如果大于则月数加一,day置1
        {
            Day = 1;
            Month++;
            if(Month>12)
            {
                Month = 1;
                Year++;
            }
        }
    }
};

int Buf[3001][13][32];

int main()
{
    int cnt = 0;
    Date tmp;
    tmp.Year = 0;
    tmp.Month = 1;
    tmp.Day = 1;
    while(tmp.Year<3001)//计算3000年的差值
    {
        Buf[tmp.Year][tmp.Month][tmp.Day] = cnt;

        tmp.Next_Day();

        cnt++;
    }

    int d1,m1,y1;
    char m[20];
    while(scanf("%d%s%d",&d1,m,&y1)!=EOF)
    {
        for(m1=1;m1<12;m1++)
        {
            if(strcmp(NameOfMonth[m1],m)==0)
                break;
        }
        int days = Buf[y1][m1][d1]-Buf[2018][4][10];
        days += 2;

        puts(NameOfWeekday[(days%7+7)%7]);
    }
    return 0;
}
以后再仔细弄吧,现在时间不太够了~


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值