日期转换为星期 基姆拉尔森公式

方法1:基姆拉尔森公式

(d + 2m + 3(m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7

  • d 为日期,范围是1-31
  • m 为月份,范围是3-14,当年的1,2月需处理为上一年的13,14月
  • y为年份,当月份为1,2时,y需减一
  • 结果为0-6,星期日用0表示,星期一为1,以此类推,星期六为6

方法2:每次加1天,加到目标日期

#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>

using namespace std;

string months[13] = {
    
    " ","January","February","March","April","May","June","July","August","September","October","November","December"};
unordered_map<string, int> map_month;
string map_day[8] = {
    
    " ","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int month_day[2][13] = {
    
    
    {
    
    0,31,28,31,30,31,30,31,31,30,31,30,31}, //common year
    {
    
    0,31,29,31,30,31,30,31,31,30,31,30,31}  //leap year
};

int leap(int year);
bool dayJudge(int day1, int month1, int year1, int day2, int month2, int year2);
void printDay(int day, int month, int year);

int main(){
    
    
    for(int i=1; i<=12; i++) map_month[months[i]] = i;
    int day, year;
    string month;
    while(cin>>day>>month>>year){
    
    
        printDay(day, map_month[month], year);
    }
    return 0;
}

int leap(int year){
    
    
    if((year%4==0 && year%100!=0) || year%400==0) return 1;
    else return 0;
}

bool dayJudge(int day1, int month1, int year1, int day2, int month2, int year2){
    
    
    if(year1!=year2) return year1>year2;
    else if(month1!=month2) return month1>month2;
    else return day1>day2;
}

void printDay(int day, int month, int year){
    
    
    //以2001年10月9日是星期2为基准
    int base_day=9, base_month=10, base_year=2001;
    bool later = true;
    if(dayJudge(base_day, base_month, base_year, day, month, year)){
    
    
        swap(base_day, day);
        swap(base_month, month);
        swap(base_year, year);
        later = false;
    }
    int day_gap = 0;
    while(base_year!=year || base_month!=month || base_day!=day){
    
    
        base_day++;
        if(base_day>month_day[leap(base_year)][base_month]){
    
    
            base_month++;
            base_day = 1;
        }
        if(base_month>12){
    
    
            base_year++;
            base_month = 1;
        }
        day_gap++;
    }
    day_gap %= 7;
    int ans = later ? (day_gap<=5 ? 2+day_gap : day_gap-5) : (day_gap<=1 ? 2-day_gap : 9-day_gap);
    cout<<map_day[ans]<<endl;
    return;
}

猜你喜欢

转载自blog.csdn.net/sinat_37517996/article/details/105392093
今日推荐