日期到天数的映射类题目
核心思想
首先,我们需要把每个月的天数和月份对应的数字建立起映射关系
可以使用一个数组进行表示
int arr[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
如此,便可以将月份数当作的对应天数数组的下标获得这个月的天数
然后,再根据年份判断是否为闰年,如果是闰年2月份的天数(arr[2])+1即可
计算日期到天数转换 HJ73
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n) O(n) ,空间复杂度:O(1) O(1)
这道题我们就按照上面的思路,建立好天数与月份的映射关系,直接for循环到指定的月份,累加天数,再加上当月的天数的即可
#include <stdio.h>
int isLeapYear(int year)
{
return (year%4==0&&year%100!=0)||year%400==0;
}
int main()
{
int arr[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int year=0,month=0,day=0;
scanf("%d %d %d",&year,&month,&day);
arr[2] = isLeapYear(year)?29:arr[2];
int sum = 0;
for(int i=1;i<month;i++)
{
sum+=arr[i];
}
sum+=day;
printf("%d",sum);
return 0;
}
两个具体日期相差的天数
思路: 要用到上面一题的结果, 可以想到的是, 如果在不同的年份, 中间还有间隔的年份的话, 那么总天数 = (小年天数-当天在该年的天数)+(间隔年份)* 对应年份的天数+当天在大年的天数
但如果在同一年,则不能采用这个计算方法,应该是直接第二个日期在当年的天数-第一个日期在当年的天数
统一一下, 应该是从第一年开始算起, 一直加到第二个日期的前一年, 再加上第二个日期的天数-第一个日期的天数
因此, 代码应该这样写:
#include <stdio.h>
int isLeapYear(int year)
{
return (year%4==0&&year%100!=0)||year%400==0;
}
int getDayOfYear(int year,int month,int day)
{
int arr[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
arr[2] = isLeapYear(year) ? 29 : arr[2];
int sum = 0;
for (int i = 1; i < month; i++)
{
sum += arr[i];
}
sum += day;
return sum;
}
int main()
{
int year1=0,month1=0,day1=0;
int year2=0,month2=0,day2=0;
scanf("%d %d %d",&year1,&month1,&day1);
scanf("%d %d %d",&year2,&month2,&day2);
int days1 = getDayOfYear(year1,month1,day1);
days1 = getDayOfYear(year2,month2,day2) - days1;
int days2 = 0;
for(int i=year1;i<year2;i++)
{
days2 += isLeapYear(i) ? 366 : 365;
}
printf("%d days",days1+days2);
return 0;
}