日期2

/*
题目 1043 day of week 
题目描述:
We now use the Gregorian style of dating in Russia. The leap years are years with number divisible by 
4 but not divisible by 100, or divisible by 400.For example, years 2004, 2180 and 2400 are leap. Years 2004, 
2181 and 2300 are not leap.Your task is to write a program which will compute the day of week corresponding 
to a given date in the nearest past or in the future using today’s agreement about dating.
输入:
There is one single line contains the day number d, month name M and year number y(1000≤y≤3000). The month
name is the corresponding English name starting from the capital letter.
输出:
Output a single line with the English name of the day of week corresponding to the date, starting from the capital
letter. All other letters must be in lower case.
样例输入:
9 October 2001
14 October 2001
样例输出:
Tuesday
Sunday
提示:
Month and Week name in Input/Output:
January, February, March, April, May, June, July, August, September, October, November, December
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
*/
#include <stdio.h>
#include <string.h>
#define isyear(x) x%100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1:0
//定义宏判断是否为闰年,方便计算每月天数
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
};//预存每月的天数,注意二月配合宏定义作特殊处理
struct date{//日期类,方便日期的推移
    int day;
    int month;
    int year;
    void nextday(){//计算下一天的日期
        day++;
        if(day > dayofmonth[month][isyear(year)]){
        //若日数超过了当月最大日数
            day = 1;
            month++;//进入下一月
            if(month>12){//月数超过12
                month = 1;
                year ++;//进入下一年
             
            }
        }
    }
 
};
int buf[5001][13][32];//保存预处理的天数,因为题目要求,可以只初始化到3001(1000<=y<=3000)
char monthname[13][20]={
"",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};//月名,每个月名对应下标1到12
char weekname[7][20] ={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};//周名,每个周名对应下标0到6
 
int main(){
    date tmp;
    int cnt = 0;//天数计数
    tmp.day = 1;
    tmp.month=1;
    tmp.year=0;//初始化日期类对象为0年1月1日
    while(tmp.year != 5001){//日期不超过5000年
        buf[tmp.year][tmp.month][tmp.day] = cnt;
        //将该日与0年1月1日的天数差保存起来
        tmp.nextday();//计算下一天日期
        cnt++;//计数增加,每经过一天计数器即+1,代表与原点日期的间隔又增加了一天
    }
    int d,m,y;
    char s[20];
    while(scanf("%d%s%d",&d,&s,&y) != EOF){
        for(m=1;m<=12;m++){
            if(strcmp(s,monthname[m])==0){
              break;//将输入字符串与月名比较得出月数
            }
        }
        int days = buf[y][m][d] - buf[2012][7][16];
        //计算给定日期与今日日期的天数间隔(注意可能为负)
        days += 1;//今天2012.7.16为星期一,对应数组下标为1,则计算1经过days天后的下标
        puts(weekname[(days % 7 + 7) % 7]);//将计算后得出的下标用7对其取模,并且保证其为非负数,则该下标即为答案所对应的下标,输出即可
    }
    return 0;
}


#include <stdio.h>
#include <string.h>
 
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 monthName[13][20] = {
    " ",
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
};
char weekName[8][20] = {
    " ",
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};
//判断闰年
int leap_year(int year){
    if((year%100 != 0 && year%4 == 0) || (year % 400 == 0)){
        return 1;
    }
    else{
        return 0;
    }
}
//计算天数
int TDay(int day,char month[],int year){
 
    int day1 = 0,i,j;
    int isleap_year = leap_year(year);
 
    for(i = 1;i< year;i++){  
        if(leap_year(i)){  
            day1 += 366;  
        }  
        else{  
            day1 += 365;  
        }  
    }  
 
    for(i = 1;i < 13;i++){
        if(strcmp(month,monthName[i]) == 0){
            break;
        }
    }
    for(j = 1;j < i;j++){
        day1 +=  dayOfMonth[j][isleap_year];
    }
     
    day1 += day;
 
    return day1%7+1;
}
 
int main()
{
    int day,year;
    char month[20];
    //freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin); 
    while(scanf("%d%s%d",&day,month,&year) != EOF)
    {
        printf("%s\n",weekName[TDay(day,month,year)]);
    }
    return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值