机试算法讲解: 第4题 某一天是星期几?

来源:互联网 发布:c语言添加线程 编辑:程序博客网 时间:2024/06/15 10:45
/*问题:算出一天是星期几思路:找到一个基点,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,年数加1else{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;需要再加7int 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;//多了一天,应该不需要加上1printf("%d",absDiffDay);printf("%s",dayOfWeek(diffDay,3));                                                                                                                                                                                                     }getchar();return 0;}

0 0
原创粉丝点击