原题链接:蓝桥杯算法提高VIP-日期计算
解题思路:
程序写得很复杂,没有认真去看能否简化代码,按照自己的思路一步一步就写下去,然后测试,然后提交,然后AC。
注意事项:
分成两种情况考虑:
(1)如果当前日期大于2011/11/11,则累加求和,求当前日期与2011/11/11相差的天数,得到一个正数。
(2)如果当前日期小于2011/11/11,则累减求差,求当前日期与2011/11/11相差的天数,得到一个负数。
参考代码:
#include<iostream>
using namespace std;
typedef struct
{
int yy,mm,dd;
}Date;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool cmp(Date d1,Date d2) //判断日期d1是否大于日期d2
{
if(d1.yy!=d2.yy)
return d1.yy>d2.yy;
if(d1.mm!=d2.mm)
return d1.mm>d2.mm;
return d1.dd>d2.dd;
}
bool leap(int year) //判断是否是闰年
{
if(year%4==0 && year%100!=0 || year%400==0)
return true;
else
return false;
}
void output(int s) //根据s的值得输出星期
{
switch(s)
{
case 0: cout<<5; break;
case 1: cout<<6; break;
case 2: cout<<7; break;
case 3: cout<<1; break;
case 4: cout<<2; break;
case 5: cout<<3; break;
case 6: cout<<4; break;
}
}
int main()
{
Date myd,myd0={2011,11,11};
int sum=0;
cin>>myd.yy>>myd.mm>>myd.dd;
if(cmp(myd,myd0)) //日期大于2011/11/11的情况
{
int year;
for(year=myd0.yy+1;year<myd.yy;year++)
{
if(leap(year))
sum=sum+366;
else
sum=sum+365;
}
if(myd.yy-myd0.yy==0) //年份相同,即2011年
{
if(myd.mm-myd0.mm==0) //月份相同 ,即11月
sum=sum+myd.dd-myd0.dd;
else //月份不同,肯定是12月
sum=sum+(month[myd0.mm]-myd0.dd)+myd.dd;
}
else //年份不同,2011年以后的年份
{
sum=sum+(month[myd0.mm]-myd0.dd); //本月剩余的天数
for(int i=myd0.mm+1;i<=12;i++) //下个月到12月的天数
sum=sum+month[i];
for(int i=1;i<myd.mm;i++) //下一年1月到当前月前一个月的天数
sum=sum+month[i];
if(myd.mm>2 && leap(myd.yy)) //当前月大于2,而且当前月是闰年,天数加1
sum++;
sum=sum+myd.dd; //到当前日的天数
}
}
else //日期小于2011/11/11的情况
{
int year;
for(year=myd0.yy-1;year>myd.yy;year--)
{
if(leap(year))
sum=sum-366;
else
sum=sum-365;
}
if(myd.yy-myd0.yy==0) //年份相同,即2011年
{
if(myd.mm-myd0.mm==0) //月份相同 ,即11月
sum=sum-(myd0.dd-myd.dd);
else //年份相同,但是月份不同情况
{
sum=sum-myd0.dd; //2011年11月的天数
for(int i=myd.mm+1;i<myd0.mm;i++) //2011年其他月的天数
sum=sum-month[i];
sum=sum-(month[myd.mm]-myd.dd); //当前月到月末的天数
if(myd.mm<=2 && leap(myd.yy)) //当前月小于2,而且是闰年
sum--;
}
}
else //年份不同,即2011年以前
{
sum=sum-(365-(30-11+31)); //2011年1月1日到2011年11月11日的天数
for(int i=myd.mm+1;i<=12;i++) //当前月的下一个月到12月的天数
sum=sum-month[i];
sum=sum-(month[myd.mm]-myd.dd); //当前月到月末的天数
if(myd.mm<=2 && leap(myd.yy)) //当前月小于2,而且是闰年
sum--;
}
}
output( (sum%7+7) %7 );
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复