#include <stdio.h>
char WeekList[ ][7]={"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
void dateToWeek(int y,int m, int d)
{
if (m==1 || m==2)
{
m+=12;
y--;
}
int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
printf("%s\n", WeekList[iWeek]);
}
int main()
{
int year=0,month=0,day=0;
printf("请输入日期(2000-1-1):");
scanf("%d-%d-%d",&year,&month,&day);
dateToWeek(year,month,day);
return 0;
}
/*
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月
*/
我以前的笨办法是这样的:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int Month_Day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
const char Week[7][7] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
int year,month,day;
int STDyear = 2010, STDmonth = 10, STDday = 31, STDweekday = 6;//STDweekday是参考日期的星期几,对应Week下标
int Alldays = 0; //与标准日期的间隔总天数
int diff_Flag = 0; //0表示输入时间小于标准时间,1表示大于
int WeekToday = 0;
scanf("%d-%d-%d", &year, &month, &day);
//cout<<year<<month<<day;
if((year < STDyear) || ((year == STDyear) && (month <= STDmonth)))
{
diff_Flag = 0;
while((year != STDyear) || (month != STDmonth) || (day != STDday))
{
Alldays++;
day++;
if(2 == month)
{
if(((year % 4 ==0) && (year % 100 != 0)) || (year % 400 == 0))
{
Month_Day[1] = 29;//闰年2月29天
}
else
{
Month_Day[1] = 28;
}
}
if(day > Month_Day[month - 1])//前面考虑闰年
{
day = 1;
month++;
if(month > 12)
{
month = 1;
year++;
}
}
}
}
else
{
diff_Flag = 1;
while((year != STDyear) || (month != STDmonth) || (day != STDday))
{
Alldays++;
day--;
if(2 == month)
{
if(((year % 4 ==0) && (year % 100 != 0)) || (year % 400 == 0))
{
Month_Day[1] = 29;//闰年2月29天
}
else
{
Month_Day[1] = 28;
}
}
if(day < 1)
{
month--;
if(month < 1)
{
month = 12;
year--;
}
day = Month_Day[month - 1];//前面考虑闰年
}
}
}
cout<<"间隔"<<Alldays<<"天"<<endl;
if(diff_Flag == 0)
{
WeekToday = STDweekday - (Alldays % 7);
}
else
{
WeekToday = (Alldays + STDweekday) % 7;
}
cout<<Week[WeekToday]<<endl;
return 0;
}