目录
补充知识点
1160: 6001 第几天?
1161: 6002 时间格式转换
1162: 6003 星期几?
1163: 6004 18岁生日、
补充知识点
闰年的判断方法:
能被四整除但是不能一百整除或者能被400整除
例题:
题目描述
经常会有人问你怎么判断闰年,其实很简单,就是如果年份能被4整除但是不能被100整除,或者是能被400整除,那么就是闰年,否则就不是。
输入
输入一个正整数year(1 <=year <=3000)。
输出
如果是闰年,输出YES,否则输出NO。
样例输入 复制
200
样例输出 复制
NO
#include<iostream>
using namespace std;
int run(int n)
{if((n%4==0&&n%100!=0)||(n%400==0))return 1;elsereturn 0;
}
int main()
{int y;scanf("%d",&y);if(run(y)==1)cout<<"YES";elsecout<<"NO";return 0;
}
月份的判断
1 3 5 7 8 10 12月为31天 其余(除了2月)均为30天
如果是闰年是29天 平年是28天
1160: 6001 第几天?
题目描述
给定一个日期,输出这个日期是该年的第几天。
输入
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见输入样例,另外,可以向你确保所有的输入数据是合法的。
输出
对于每组输入数据,输出一行,表示该日期是该年的第几天。
样例输入 复制
1985/1/20
2006/3/12
样例输出 复制
20
71
来源/分类
#include<iostream>
using namespace std;
int run(int n)
{if((n%400==0)||(n%4==0&&n%100!=0))return 1;elsereturn 0;
}
int main()
{int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int y,m,d;while(scanf("%d/%d/%d",&y,&m,&d)!=EOF){int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};int res = 0;if(run(y)==1)month[2]+=1;for(int i = 0;i<m;i++)res+=month[i];res+=d;cout<<res<<endl;}return 0;
}
1161: 6002 时间格式转换
题目描述
世界各地有多种格式来表示日期和时间。对于日期的常用格式,在中国常采用格式的是“年年年年/月月/日日”或写为英语缩略表示的”yyyy/mm/dd”,此次编程大赛的启动日期“2009/11/07”就是符合这种格式的一个日期,而北美所用的日期格式则为“月月/日日/年年年年”或”mm/dd/yyyy”,如将“2009/11/07”改成这种格式,对应的则是”11/07/2009”。对于时间的格式,则常有12小时制和24小时制的表示方法,24小时制用0-23来表示一天中的24小时,而12小时制只采用1-12表示小时,再加上am/pm来表示上午或下午,比如”17:30:00”是采用24小时制来表示时间,而对应的12小时制的表示方法是”05:30:00pm”。注意12:00:00pm表示中午12点,而12:00:00am表示凌晨12点。
对于给定的采用”yyyy/mm/dd”加24小时制(用短横线”-”连接)来表示日期和时间的字符串,请编程实现将其转换成”mm/dd/yyyy”加12小时制格式的字符串。
输入
第一行为一个整数T(T <= 10),代表总共需要转换的时间日期字符串的数目。
接下来的总共T行,每行都是一个需要转换的时间日期字符串。
输出
分行输出转换之后的结果。
样例输入 复制
2
2009/11/07-12:12:12
1970/01/01-00:01:01
样例输出 复制
11/07/2009-12:12:12pm
01/01/1970-12:01:01am
#include<iostream>using namespace std;int main(){int t,y,m,d,h,mm,s,cnt;char ch;scanf("%d",&t);while(t--){cnt=0;cin>>y>>ch>>m>>ch>>d>>ch>>h>>ch>>mm>>ch>>s;printf("%02d/%02d/%d-",m,d,y);if(h<12 && h>0){printf("%02d:",h);cnt+=1;}else if(h>12){printf("%02d:",h-12);}else if(h==0){printf("%02d:",h+12);cnt+=1;}else if(h==12){printf("%02d:",h);}printf("%02d:%02d",mm,s);if(cnt==1)cout<<"am"<<endl;else cout<<"pm"<<endl;}
}
1162: 6003 星期几?
题目描述
今天是2007年11月17日,星期六。现在如果我告诉你一个日期,你能告诉它是星期几吗?
输入
输入有多组测试数据,每个测试数据占一行。每行有3个整数,分别表示:年(0< year < 10000), 月(0 <= month < 13), 日(0 <= day < 32)。
输出
每个测试数据输出一行,如果输入数据不对,输出“illegal”,否则输出它是星期几。
样例输入 复制
2007 11 17
样例输出 复制
Saturday
#include<iostream>
#include<vector>
using namespace std;
int run(int n)
{if((n%4==0&&n%100!=0)||n%400==0)return 1;elsereturn 0;
}
int main()
{vector<string> a = {{"Monday"},{"Tuesday"},{"Wednesday"},{"Thursday"},{"Friday"},{"Saturday"},{"Sunday"}};int y;int m;int d;while(scanf("%d %d %d",&y,&m,&d)!=EOF){vector<string> a = {{"Monday"},{"Tuesday"},{"Wednesday"},{"Thursday"},{"Friday"},{"Saturday"},{"Sunday"}};int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//判断合不合法if(y<=0||y>10000||m>12||m<=0||d<=0||d>=32){printf("illegal\n");continue;}int res = 0;if(run(y)==1)month[2]+=1;for(int i = 1;i<y;i++){if(run(i)==1)res+=366;elseres+=365;}for(int i = 0;i<m;i++)res+=month[i];res+=d-1;cout<<a[res%7]<<endl;}return 0;
}
1163: 6004 18岁生日、
题目描述
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
输入
一个整数T,表示测试数据的组数,接下来有T行日期,每行一个,格式是YYYY-MM-DD。如我的生日是1988-03-07。
输出
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
样例输入 复制
1
1988-03-07
样例输出 复制
6574
#include<iostream>
using namespace std;
int run(int n)
{if(n%4!=0||(n%100==0&&n%400!=0))return 0;elsereturn 1;
}
int main()
{int month[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};int t;cin>>t;while(t--){int y;int m;int d;scanf("%d-%d-%d",&y,&m,&d);int count = 0;if(m>=3){for(int i=y+1;i<=y+18;i++){if(run(i))count+=366;elsecount+=365;}}else if(m<=2){for(int i=y;i<=y+17;i++){if(run(i))count+=366;elsecount+=365;}}cout<<count<<endl;}return 0;
}