最近准备蓝桥杯 总是遇到关于时间的 虽说乱凑总能凑出结果 但是还是决定整理一下
先说一下要注意的东西,似乎没要注意的东西;
我看到浙江大学ACM模板上有关于日期计算的 “性”高彩烈的去了,结果蛋碎一地,没看懂;
我写完了逗我同学 他说:“以后我也写一个”。我说:“以后,以后你都死了10 年了....” 哈哈开个玩笑进入正题
首先我们来写一个判断闰年的函数
//判断闰年
bool leap(int year)
{
return (year%400==0||year%100!=0&&year%4==0);
}
不对上面还不是首先 上面是次先 下面来个首先啊
struct Date
{
int year,month,day;
};
这个不多说 你的英语比我好;对了在这特别强调一下就是我的英语,下面所有函数的名称均是我有有道词典乱凑的
含义问题请找有道讨回公道;
还有就是月份数组
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
下面是一个计算天数的函数:
int datesum(Date x)
{
int sum=(x.year-1)*365+(x.year-1)/4;//这个是我从别地方学的 我感觉很巧妙,就拿过来了
for(int i=1;i<x.month;i++)
{
sum+=days[i];
}
if(x.month>2&&leap(x.year)) //如果这一年是闰年的话 并且月份超过2月的话就+1天
{
sum=sum+1;
}
sum+=x.day;
return sum;
}
上面是计算这个时间一共是多少天 首先每年*363天 4年一次闰年 year/4就求出了过去多少个闰年了 然后加上
后面的都好理解 就是加上相应的月份 和天数;
下面再来说一下日期向前向后推移的问题
先说一下向前推移的吧
Date dateforward(int x,Date s)
{
int sum=datesum(s);
sum-=x;
s=date(sum,1);
return s;
}
大体的思路就是先算出距离1年1月0日多少天,这里这个0 就是个标志 ;
然后减去向前推的日期 最后在你又上面的date函数推回去 ;你推我呀,我推你,一下我就推死你。
向前推的函数
Date datebackward(int x,Date s)
{
for(int i=1;i<s.month;i++)
{
x=x+days[i];
}
if(s.month>2&&leap(s.year))
{
x+=1;
}
x+=s.day;
s=date(x,s.year);
return s;
}
这个也不用过多的解释跟上面的思路一样 ;
#include<iostream>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
struct Date
{
int year,month,day;
};
//判断闰年
bool leap(int year)
{
return (year%400==0||year%100!=0&&year%4==0);
}
//计算天数
int datesum(Date x)
{
int sum=(x.year-1)*365+(x.year-1)/4;
for(int i=1;i<x.month;i++)
{
sum+=days[i];
}
if(x.month>2&&leap(x.year))
{
sum=sum+1;
}
sum+=x.day;
return sum;
}
//从第year年开始 1月1日开始的x天后是哪一天
Date date(int x,int year)
{
x=x+1;
while(x>365)
{
if(leap(year))
x=x-366;
else
x-=365;
year++;
}
Date s;
if(x==0)
{
s.year=year-1;
s.month=12;
s.day=31;
return s;
}
s.year=year;
if(leap(year))
{
for(int i=1;i<13;i++)
{
s.month=i;
if(x>dayss[i]) x-=dayss[i];
else { s.day=x;break; }
}
}
else
{
for(int i=1;i<13;i++)
{
s.month=i;
if(x>days[i])
x-=days[i];
else {s.day=x;break;}
}
}
return s;
}
//计算日期 向后推移
Date datebackward(int x,Date s)
{
for(int i=1;i<s.month;i++)
{
x=x+days[i];
}
if(s.month>2&&leap(s.year))
{
x+=1;
}
x+=s.day;
s=date(x,s.year);
return s;
}
//日期计算向前推移
Date dateforward(int x,Date s)
{
int sum=datesum(s);
sum-=x;
s=date(sum,1);
return s;
}
int main()
{
//
}
写到这感谢我自己 , 感谢你们能过读到这里 有什么不明白的可以给我留言 ;
这个题没有经过online judge的习题洗礼 ,只是我的想法 如果过哪里错了希望大家指正;
“啊,当你悲伤的时候抬头仰望那包容了一万年风霜雨雪的天空,怎能不让人顶礼膜拜!”
这是高中时背的作文 依然风骚霸道!