日期天数周几问题

第八届蓝桥杯真题:


标题:日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。  

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。  

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入
----
一个日期,格式是"AA/BB/CC"。  (0 <= A, B, C <= 9)  

输入
----
输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。  

样例输入
----
02/03/04  

样例输出
----
2002-03-04  
2004-02-03  
2004-03-02  

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

思路:看似简单,实则陷阱重重。要考虑排序+去重+闰年验证等问题。

还有一种思路,比较简单粗暴,但是没有考虑全面,仅供参考https://blog.csdn.net/z956281507/article/details/69668972

#include 
#include 
#include 
#include 
#include 
using namespace std;struct date{int year, month, day;bool operator==(const date& d){// & 的位置 固定格式return (year == d.year)&&(month == d.month)&&(day == d.day);}
};bool isyn(int y){return (y % 4 == 0) || (y % 100 && y % 400 == 0);
}
int month_days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(date d){if(isyn(d.year)){month_days[2] = 29;}else{month_days[2] = 28;}if(d.year < 1960 || d.year > 2059){return false;}if(d.month < 1 || d.month > 12){return false;}if(d.day < 1 || d.day > month_days[d.month]){return false;}return true;
}bool compare(const date &d1, const date &d2){if(d1.year != d2.year){return d1.year < d2.year;}if(d1.month != d2.month){return d1.month < d2.month;}return d1.day < d2.day;
}void print(const date &d){printf("%d-%02d-%02d\n", d.year, d.month, d.day);//%02d中2是指输出字符的最少个数,0是指不足位时前补 0
}int main()
{//整体思路是输入 + 六种可能 + 排序 + 去重 + 验证,但每一步的具体实施。 int aa, bb, cc;scanf("%d/%d/%d", &aa, &bb, &cc);//看到输入输出的时候,要想到能够格式化输出。 date d[6] = {{2000 + aa, bb, cc},{1900 + aa, bb, cc},{2000 + cc, aa, bb},{1900 + cc, aa, bb},{2000 + cc, bb, aa},{1900 + cc, bb, aa}};sort(d, d + 6,compare);int k;k = unique(d,d+6) - d;	//重载 ==  for(int i = 0; i < k; i++){if(check(d[i])){print(d[i]);}}return 0;
}

题目一:

国庆节为星期日的天数 
Problem Description
1949年的国庆节(10月1日)是星期六。 
今年(2017)的国庆节是星期日。
那么,从建国到今年,有几次国庆节正好是星期日呢?
只要答案,不限手段!可以用windows日历,windows计算器,Excel公式,。。。。。 
当然,也可以编程!
不要求写出具体是哪些年,只要一个数目!
千万不要提交源代码!
Input
无 
Output
只输出一个整数 

思路:

可以用windows日历一个一个翻,也可以编程解决问题。

#include
using namespace std;
//带有星期就不能用Excel了,熟练的话推荐直接编程实现
//可以用windows日历一个一个的翻(注意日历、Excel储存的年份是有限的) 
bool isrn(int year){return (year%400==0)||((year%4==0)&&(year%100!=0));
}
int main(){int cnt=0,ans=0;for(int i=1950;i<=2017;i++){if(isrn(i))cnt += 366;else cnt += 365;if(cnt%7==1){cout<

题目二:

下一个世界末日 
Problem Description
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。
还有人称今后的某个世纪末的12月31日,如果是星期一则会....
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 
于是,“谣言制造商”又修改为星期日......
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)
Input
无 
Output
输出一个4位整数 

#include
using namespace std;
int judge(int x)
{if(x%400==0) return 366;else if(x%4==0 && x%100!=0) return 366;else return 365;
}
int ans(int st)
{int  cnt=0;//这个地方刚开始cnt么有等于0 ,他就不对 for(int i=st;i<=st+99;i++)cnt+=judge(i);return cnt;
}
int main()
{int tt=0;for(int k=2000;k<=3000;k+=100){int t=ans(k);//	cout<

题目三:

高斯学位获取日 
Problem Description
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。 
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113 
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。
Input
无 
Output
输入一

个字符串,格式为:yyyy-mm-dd 

#include
using namespace std;
//注意了!这一题不能用excel做,因为Excel储存的时间是有限制的,17XX年他不储存! 
bool judge(int x)
{if(x%400==0) return true;if(x%4==0 && x%100!=0) return true;return false;
}
int main()
{int cnt=0;for(int i=1778;i<=2018;i++){if(judge(i))cnt+=366;else cnt+=365;if(cnt<=8113&&cnt>=8113-366){cout<

题目四:

炸弹爆炸日期 
Problem Description
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。
Input
无 
Output
输出一个字符串,格式为:yyyy-mm-dd 

思路:纯粹用EXCEL做,写上日期和天数,加一下就能得到答案。很神奇!  答案:2017-8-5 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章