本题目主要解决如下几个问题: 1、该月的1号是星期几; 2、该月份有几天; 3、2月份天数的特殊处理; 4、输出格式问题。
我们来一次解决如上问题:
我们知道星期几是以7天作为循环周期的,我们分别用0~6这几个数字,分别代表星期天到星期六。
为此我们可以用余数的方法来求得第k天后是星期几。 我们先用简单的来计算一下,现已知今天是星期天,第k天后是星期几,我们可以观察下图,得出一个规律:第k天后是星期k%7(如果是0代表星期天)
题目给的已知条件是星期一,现要求第k天是星期几,这里的k是2007/1/1到所要求的XXXX年XX月1日的总天数,为此我们得到 第k天后是星期(k-(7-1))%7,这里的1是指星期一所对应序号1,因为我们是从星期一开始计算的,而减去(7-1)是为了把初始值变成星期天,方便计算。 通过余数的计算我们把(k-(7-1))%7化简一下: ( k - (7-1))%7 =( k - 7 + 1 )%7 =( k%7 - 7%7 + 1%7 )%7 =( k%7 + 1)%7 (只要知道总天数,代入该式就可求出XXXX年XX月1日是星期几)
我们可以用一个数组来记录每月有几天,需要时在调用。
static int MonthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
以365天的来算,其中数组下标表示对应的月份,下标0对应的月份做特殊处理,遇到闰年再把MonthDay[2]加一即可。
其实也就是判断某年是否为闰年的问题,比较简单,代码如下:
问题4:输出格式问题
查看样例输出,可以看出,每一个星期几对应3个空格,即用%3d的格式输出。 每次输出星期6之后,就要输出\n,但这里需要注意一个问题,即最后输出“——————————-”前也要输出一个\n,即以下代码输出最后一行:
这会导致该月份最后一天是星期6这种特殊情况,而输出多一个\n,例如2015年2月。
所以用if语句判断最后一行前面的\n的输出情况。
总的代码如下:
若觉得文章对你有帮助,随手转发分享,也是我们继续更新的动力