| 写在开头
前两周磨磨唧唧把第二章暴力求解枚举部分的例题和习题都AC了,思路都不太难,找到规律很快就能写出来,想着一定要写刷题笔记,把coding时遇到的困难都记录下来,方便以后复习,却也一直未曾动笔。21号考研成绩就要出来了,最近忙着找工作的事也没刷题,今晚继续,终于决定记录下来。
知道自己的coding一直是硬伤,所以更要比别人努力一点。
| 2.2 模拟
2.日期问题
2.6 今天的第几天?(清华大学复试上机题)
今年的第几天?_牛客题霸_牛客网 (nowcoder.com)
1.我的思路
看到日期的年月日问题,首先想到了要判断输入的年份是否是闰年,判断标准如下:
能被400整除 || 能被4整除但不能被100整除
不同月份天数不同,没想到可以用数组记录闰、平年的月份
2.想不出来直接看答案
①预处理:程序真正处理输入输出数据之前,预处理出所有月份的天数并保存。这样真正处理时只需要O(1)的时间复杂度就能读出保存的数据。(空间换时间)
用二维数组记录 (把列写成13,这样下标和月份能刚好对上)
int day [2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31}, // 平年每个月份的天数
{0,31,29,31,30,31,30,31,31,30,31,30,31} // 闰年每个月份的天数
}
②处理数据:输入年,月,日三个整数
判断是否是闰年,根据返回结果判断使用预处理中的哪一行月份数据。
③for循环累加该月份之前的天数
④循环结束,加上该月份的天数,打印结果。
AC。
3.附上源代码
#include <stdio.h>
#include <stdbool.h>
// 预处理
int day[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
// 判断是否是闰年
bool isLeapYear(int y){
return ( y%400==0 || ((y%4==0)&&y%100!=0) );
}
int main() {
int Y,M,D;
while(scanf("%d %d %d\n",&Y,&M,&D)!=EOF) {
int d=0;
// 判断Y年是否是闰年,不是就调用预处理中的第一行数据计算,否则调用第二行数据
int row = isLeapYear(Y);
// 累加月份之前的天数
for ( int i = 0 ; i < M ; i++ ) {
d += day[row][i];
}
// 累加本月天数
d += D;
printf("%d\n",d);
}
}