星期几(冬季每日一题 6)

已知 1 1 1 1 1 1 1 1 1 日是星期一。

现在给定一个日期,请你判断是星期几。

注意闰年的 2 2 2 月有 29 29 29 天。

满足下面条件之一的是闰年:

年份是 4 4 4 的整数倍,而且不是 100 100 100 的整数倍;
年份是 400 400 400 的整数倍。

输入格式
输入包含多组测试数据。

每组数据占一行,包含一个整数 d 表示日,一个字符串 m 表示月,一个整数 y 表示年。

月份 1 ∼ 12 1∼12 112,依次如下所示:

January, February, March, April, May, June, July, August, September, October, November, December

输出格式
每组数据输出一行结果,输出一个字符串表示给定日期是星期几。

周一至周日依次如下所示:

Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

数据范围
1000 ≤ y ≤ 3000 , 1000≤y≤3000, 1000y3000,
给定日期保证合法。
每个输入最多包含 100 100 100 组数据。

输入样例:

9 October 2001
14 October 2001

输出样例:

Tuesday
Sunday

#include

using namespace std;

const int N = 20;

string s;
int d, m, y;
char month[][15] = {"", "January", "February", "March", "April", "May", 
"June", "July", "August", "September", "October", "November", "December"};
char zd[][15] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int get(int y, int m){
    
    int res = 0;
    res += days[m];
    if(m == 2 && (y % 4 == 0 && y % 100 != 0 || y % 400 == 0))
        res ++;
    
    return res;
}

int main(){
    
    
    while(cin >> d >> s >> y){
        
        for(int i = 1; i <= 12; i++)
            if(s == month[i]) m = i;
        
        int sum = 0;
        
        for(int i = 1; i < y; i++){
            sum += 365;
            if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0) sum++;
        }
        sum += d;
        for(int i = 1; i < m; i++) sum += get(y, i);
        sum --;
        
        cout << zd[sum % 7] << endl;    
    }
    
    return 0;
}

你可能感兴趣的:(冬季每日一题,模拟)