原题链接:蓝桥杯算法提高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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复