求星期几问题

普通hash解法:
#include <stdio.h>
#include<algorithm>
#include<string.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0

char month[13][20]={"","January","February","March","April","May","June","July","August","September","October","November","December"};
char Weekday[7][20]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
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 Year;
int Mon;
int Day;
void nextDate(){
Day++;
if(Day>dayofMonth[Mon][ISYEAP(Year)]){
    Mon++;
    Day=1;
    if(Mon>12){
      Year++;
      Mon=1;
    }

}
}
};
int buf[3001][13][32];
int main()
{
    struct Date Ori;
    Ori.Year=0;
    Ori.Mon=1;
    Ori.Day=1;
    int cnt=1;
    buf[Ori.Year][Ori.Mon][Ori.Day]=cnt;
    while(Ori.Year<3001){//提前将每个日期对应到同一条数轴上去
        cnt++;
        Ori.nextDate();
        buf[Ori.Year][Ori.Mon][Ori.Day]=cnt;

    }
    
    int d,y,m;
    char s[20];
    while(scanf("%d %s %d",&d,&s,&y)!=EOF){

        for(m=1;m<=12;m++){
            if(strcmp(s,month[m])==0)
               break;
        }
        int days=buf[y][m][d]-buf[2012][7][16];
        days+=1;

    puts(Weekday[(days%7+7)%7]);
    }

    return 0;
}
Zeller公式解法:

#include <stdio.h>
#include<algorithm>
#include<string.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0

char month[13][20]={"","January","February","March","April","May","June","July","August","September","October","November","December"};
char Weekday[7][20]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

int main(){
    int y,m,d,w;
    char s[20];
    while(scanf("%d %s %d",&d,&s,&y)!=EOF){
        for(m=1;m<13;m++){
            if(strcmp(s,month[m])==0)
                break;
        }
        int c=y/100;

        if(y<=1582&&m<=10&&d<=4||y<1582){
                y=y%100;
            w=y+y/4+c/4-2*c+13*(m+1)/5+d+2;
        }
        else{
            y=y%100;
            w=y+y/4+c/4-2*c+26*(m+1)/10+d-1;

            w=(w%7+7)%7;
        }

        puts(Weekday[w]);

    }
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值