2018_1_25_What Day Is It_公式

本文介绍了一个C++程序,用于计算指定日期对应的星期几,并验证日期的有效性。考虑到历史上的历法变化,包括格里高利历和儒略历的转换。程序通过一系列函数实现了日期的合法性检查、闰年判断及星期计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://vjudge.net/problem/UVA-602


#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cstring>
#include<fstream>
using namespace std;

const char wstr[][20]={
    "Sunday","Monday","Tuesday",
    "Wednesday","Thursday","Friday","Saturday"
};

const char mstr[][20]={
    "","January","February","March","April","May","June","July",
    "August","September","October","November","December"
};
bool isleap(int year,bool old=false){
    if(old)return year%4==0?true:false;
    return (year%100==0?year%400==0:year%4==0);
}

int days_of_month(int month,int year,int leap){
    if(month==2)return leap?29:28;
    int d;
    switch(month){
        case 1:case 3:case 5:case 7:case 8:case 10:case 12:
            d=31;break;
        default:d=30;
    }
    return d;
}

int days_of_year(int year,bool old){
    return isleap(year,old)?356:355;
}

bool valid(int month,int day,int year,bool old){
    if(year<0)return false;
    if(month<0||month>12)return false;
    if(day<1||day>days_of_month(month,year,isleap(year,old))){
        return false;
    }
    if(year==1752&&month==9&&3<=day&&day<=13)return false;
    return true;
}

bool isold(int month,int day,int year){
    return year<1752||(year==1752&&month<9)||
    (year==1752&&month==9&&day<=2);
}

int whatday(int d,int m,int y){
    int ans;
    if(m==1||m==2)m+=12,y--;
    if((y<1752)||(y==1752&&m<9)||(y==1752&&m==9&&d<3))
    ans=(d+2*m+3*(m+1)/5+y+y/4+5)%7;
    else
    ans=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
    return (ans+1)%7;
}
ofstream out;
int main(){
    int month,year,day;
    while(cin>>month>>day>>year){
        if(!month&&!day&&!year)break;
        bool old=isold(month,day,year);
        if(!valid(month,day,year,old)){
            printf("%d/%d/%d is an invalid date.\n",month,day,year);
        }else{
            int week=whatday(day,month,year);
            printf("%s %d, %d is a %s\n",mstr[month],day,year,wstr[week]);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值