对于日期类问题重要的是首先需要将每个月的日期记录下来以及重要的处理闰年的问题,每个月的日期记录下来可以用一个二维数组从第一维记录月份第二维记录是否是闰年即像这样记录
int date[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},
{31,31},{30,30},{31,31},{30,30},{31,31}};
对于闰年有一个公式:能被4整除并且不能被100整除的是闰年或者能被400整除的数是闰年代码可以像这样写
bool isLeap(dd a){
return (a.year % 4 == 0 && a.year % 100 != 0) || a.year % 400 == 0;
}
日期类问题大部分应该都与这样的两个知识点脱不了干系,如清华大学某年复试题
描述
输入年、月、日,计算该天是本年的第几天。
输入描述:
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
输出描述:
输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年、月、日对应本年的第几天。
示例1
输入:
1990 9 20 2000 5 1
复制输出:
263 122
代码如下:
#include<iostream>
using namespace std;
int date[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},
{31,31},{30,30},{31,31},{30,30},{31,31}};
typedef struct dd{
int year;
int mon;
int day;
}dd;
bool isLeap(dd a){
return (a.year % 4 == 0 && a.year % 100 != 0) || a.year % 400 == 0;
}
int main(){
dd a;
int res = 0;
while(scanf("%d %d %d", &a.year, &a.mon, &a.day) != EOF){
res = 0;
if(isLeap(a) == true){
for(int i = 1;i < a.mon;i++){
res += date[i][1];
}
res += a.day;
}else{
for(int i = 1;i < a.mon;i++){
res += date[i][0];
}
res += a.day;
}
cout<<res<<endl;
}
}
KY222 打印日期
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
示例1
输入:
2000 3 2000 31 2000 40 2000 60 2000 61 2001 60
复制输出:
2000-01-03 2000-01-31 2000-02-09 2000-02-29 2000-03-01 2001-03-01
#include<iostream>
using namespace std;
int date[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30}
,{31,31},{30,30},{31,31}};
bool isLeap(int year){
return ((year % 100 != 0) && (year % 4 == 0)) || (year % 400 == 0);
}
int main(){
int year = 0,dayt = 0, month = 0, day = 0;
while(scanf("%d %d", &year, &dayt) != EOF){
month = 1;
if(isLeap(year) == true){
for(int i = 1; i <= 12; i++){
if(dayt > date[i][1]){
month++;
dayt -= date[i][1];
}else{
day = dayt;
break;
}
}
}else{
for(int i = 1; i <= 12; i++){
if(dayt > date[i][0]){
month++;
dayt -= date[i][0];
}else{
day = dayt;
break;
}
}
}
/*if(month < 10 && day < 10){ //当时没有考虑到用格式控制只是暴力的把每种情况写出来
printf("%d-0%d-0%d\n", year, month, day);
}else if(month < 10 && day >= 10){
printf("%d-0%d-%d\n", year, month, day);
}else if(month >= 10 && day < 10){
printf("%d-%d-0%d\n", year, month, day);
}else if(month >= 10 && day >= 10){
printf("%d-%d-%d\n", year, month, day);
}*/
printf("%04d-%02d-%02d", year, month, day);//上面的if语句可以直接写成此语句
}
}
KY258 日期累加
描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
示例1
输入:
1 2008 2 3 100
复制输出:
2008-05-
#include<iostream>
#include<cstdio>
using namespace std;
int date[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int yearNumber(int year){
if(isLeap(year)){
return 366;
}else{
return 365;
}
}
int main(){
int year = 0, month = 0, day = 0, n = 0, number = 0; //number记录天数
cin>>n;
while(n--){
scanf("%d %d %d %d", &year, &month, &day, &number);
int t = isLeap(year);
int i = 1;
for(int i = 1; i < month; i++){
number+= date[i][t];
}
number += day;
while(number > yearNumber(year)){ /*确定年份,由于把年份累加上去可能超过本年的天数,
故需要对年份进行处理,如果加上去超过一年则年份加一,加的天数减去一年的天数*/
number -= yearNumber(year);
year++;
}
month = 1;
t = isLeap(year);
while(number > date[month][t]){ //确定月份
number -= date[month][t];
month++;
}
day = number;
printf("%04d-%02d-%02d\n", year, month, day);
}
}