年月日计算星期公式

if( M==1 || M==2 )
    {
        M+=12;
        --Y;
    }
	//1582年9月3日后:w = (d + 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
	//1582年9月3日前:w = (d+2*m+3*(m+1)/5+y+y/4+5) % 7;
	//0是星期一
    if( Y < 1582 || Y == 1582 && M < 9 || Y == 1582 && M == 9 && D < 3 ) return (D+2*M+3*(M+1)/5+Y+Y/4+5)%7;
    else return (D+2*M+3*(M+1)/5+Y+Y/4-Y/100+Y/400)%7;


int c=year/100;
int y=year-c*100;
int week=(c/4)-2*c+(y+y/4)+(13*(month+1)/5)+day-1;
while(week<0){week+=7;}
week%=7;
switch(week)
{
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 0:printf("Sunday\n");break;
//只有在1582 9 3后使用
}


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

string weeks[7]= {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
string months[12]= {"January","February","March","April","May","June","July","August","September","October","November","December"};

int day1(int M,int D,int Y)
{
	if( M==1 || M==2 )  
    {  
        M+=12;  
        --Y;  
    }
    if( Y < 1582 || Y == 1582 && M < 9 || Y == 1582 && M == 9 && D < 3 ) return (D+2*M+3*(M+1)/5+Y+Y/4+5)%7;  
    else return (D+2*M+3*(M+1)/5+Y+Y/4-Y/100+Y/400)%7;  
}
void day2(int month,int day,int year)
{
	int c=year/100;  
	int y=year-c*100;  
	int week=(c/4)-2*c+(y+y/4)+(13*(month+1)/5)+day-1;  
	while(week<0){week+=7;}  
	week%=7;  
	switch(week)  
	{  
		case 1:printf("Monday\n");break;  
		case 2:printf("Tuesday\n");break;  
		case 3:printf("Wednesday\n");break;  
		case 4:printf("Thursday\n");break;  
		case 5:printf("Friday\n");break;  
		case 6:printf("Saturday\n");break;  
		case 0:printf("Sunday\n");break;  
		default: ;
	}  
}  

int main()
{
    int m, d, y;
    while( scanf("%d %d %d",&m, &d, &y), m+d+y )
    {
        printf("%s\n",weeks[day1(m,d,y)].c_str());
		day2(m,d,y);
    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值