您的位置:首页 > 其它

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

2015-07-30 23:27 363 查看
/*
问题:算出一天是星期几
思路:找到一个基点,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: