蓝桥杯练习笔记(二十-日期问题)
日期题常见于填空题,关键点涉及闰年的判断和星期几的判断
1.根据间隔天数计算日期
题目来源:CSDN算法技能树
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
提示:
先判断是否为闰年,这会影响2月份是28还是29,如果是闰年,2月份是29,如果不是,就是28
#include <stdio.h>
int main()
{
int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = 1000;
int year = 2014, month = 11, day = 9;
int i;
for (i = 0; i < days; i++)
{
day++;
if (day > monthDays[month - 1])
{
day = 1;
month++;
if (month > 12)
{
month = 1;
year++;
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
monthDays[1] = 29;
else
monthDays[1] = 28;
}
}
}
printf("%d-%d-%d\n", year, month, day);
getchar();
return 0;
}
关键点
- 闰年的判断(能被400整除 或者 能被4整除但同时不能被100整除)
- 月份用数组来存储,根据是否闰年来修改2月的值
2.根据间隔天数判断星期几
整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一?(其中已知1901年1月1日是星期二)
提示:
判断1901年1月1日到2000年12月31的每一天是星期几,如果是星期一则统计的个数+1。
#include <stdio.h>
int main()
{
int year, day, dayrun = 0, dayping = 0, sumday = 0;
int count = 0;
for (year = 1901; year <= 2000; year++)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
dayrun += 366;
}
else
{
dayping += 365;
}
}
sumday = dayrun + dayping;
for (day = 2; day <= sumday - 7; day += 7)
{
count++;
}
printf("%d", count);
return 0;
}
关键点
- 已知起始日期和最终日期我们就能得知一共有多少天(不管是直接按这里这种根据年份直接计算还是按照最上面的题目一样直接遍历得到都行)
- 这里最后这个for循环写得有点看不明白,在我看来先将总共天数减去6,然后就能直接除以7来得到一共有多少周,也就有多少个周一,再算上余数即可,这里感觉不太直观。