/* 问题:算出一天是星期几 思路:找到一个基点,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; }