/*
问题:算出一天是星期几
思路:找到一个基点,1970年1月1日是星期几,在此基础上算出新日期和旧日期相差多少天,再除以7即可
例如19700101是星期1,那么19700108与之相差8-1=7天 [1+7]%7 = 1即为星期一,[1+6]%7=0->转换为星期天
若为1969年12月31日,相差-1天,[1 + (-1)]%7 = 0->认为是星期天,19891230,相差2天,[1 + (-2)]%7=-1->星期六
总结: 1, 2, 3, 4, 5, 6 0
-6,-5, -4, -3, -2,-1
周1 周2 周2 周4 周5 周6 周日
基点的选取用今天:20140122星期3
逆推:需要知道1970年1月1日是星期几
计算2个日期相差的天数,以0年1月1日开始记为1
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define Leap(y) ( (y%4==0 && y%100!=0) || (y%400==0))
int iMonArr[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
typedef struct Date
{
int iYear;
int iMon;
int iDay;
void nextDay()
{
//日期必须先加再判断是否超出
iDay++;
if(iDay > iMonArr[iMon][Leap(iYear)])
{
iDay = 1;
iMon++;
if(iMon > 12)
{
iMon = 1;
iYear++;
}
}
}
//int nextDay()//计算下一天的日期不需要返回值
//这个函数存在错误
/*
void nextDay()
{
//int iCount;
//while(iYear < 5001)//不需要限制年数,年数的限制是为了防止缓冲区溢出,在main函数中做的。计算的是下一天日期
//{
//天数没有超过当月最大天数
//if(iDay<iMonArr[13][Leap(iYear)])//这里不是13,而是iMonArr[iMon][Leap(iYear)]
iDay++;
{
iDay++;
}
//如果已经超过当月最大天数
else
{
//如果月份不是12,则天数归1,月份加1,
if(iMon!=12)
{
iDay = 1;
iMon ++;
}
//月份是12,则天数归1,月份归1,年数加1
else
{
iYear++;
iMon = 1;
iDay = 1;
}
}
}
*/
}Date;
int dateBuf[5001][13][32];
int diffDays(Date& date1,Date& date2)
{
int d1 = dateBuf[date1.iYear][date1.iMon][date1.iDay];
int d2 = dateBuf[date2.iYear][date2.iMon][date2.iDay];
printf("d1:%d\n",d1);
printf("d2:%d\n",d2);
int iDayDiff = d1 - d2;
return iDayDiff;
}
char* dayOfWeek(int iDiffDays,int iCurWeekOfDay)
{
//int iTemp = (iDiffDays + iCurWeekOfDay )%7;需要再加7
int iTemp = ( (iDiffDays + iCurWeekOfDay)%7 + 7 )%7;
switch(iTemp)
{
case 0:
return "星期天";
case 1:
return "星期一";
case 2:
return "星期二";
case 3:
return "星期三";
case 4:
case -3:
return "星期四";
case 5:
return "星期五";
case 6:
return "星期六";
default:
return "不知道是星期几";
}
}
int main(int argc,char* argv[])
{
//建立日期到距离0年1月1日相差的天数
Date baseDate;
int count = 0;
baseDate.iYear = 0;
baseDate.iMon = 1;
baseDate.iDay = 1;
while(baseDate.iYear < 5001)
{
dateBuf[baseDate.iYear][baseDate.iMon][baseDate.iDay] = count;
baseDate.nextDay();
count++;
}
Date date;
//while(scanf("%4d%2d%2d",date.iYear,date.iMon,date.iDay)!=EOF)
while(scanf("%4d%2d%2d",&date.iYear,&date.iMon,&date.iDay)!=EOF)
{
Date date2;
date2.iYear = 2014;
date2.iMon = 1;
date2.iDay = 22;
int iCurDayOfWeek = 3;//2014年1月22日是周三
int diffDay = diffDays(date,date2);
int t1 = abs(diffDay);
int absDiffDay = t1 + 1;//多了一天,应该不需要加上1
printf("%d",absDiffDay);
printf("%s",dayOfWeek(diffDay,3));
}
getchar();
return 0;
}