日期类问题方法
预处理:在程序真正开始输入数据之前,先将所有日期与原点日期之间的天数差保存起来,之后直接调用即可
例1:九度1096
题目描述:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出:
每组数据输出一行,即日期差值
样例输入:
20110412
20110422
样例输出:
11
#include<stdio.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
//定义宏判断是否为闰年,是方便计算每月天数
//预存每月的天数
int dayOfMonth[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
};
//定义日期类
struct Date{
int Year;
int Month;
int Day;
void nextday(){
Day++;
if(Day>dayOfMonth[Month][ISYEAP(Year)])
{
Day=1;
Month++;
if(Month>12)
{
Month=1;
Year++;
}
}
}
}; //不要忘记逗号!
int abs(int a){return a>0?a:-a;} //求绝对值函数
int buf[5001][13][32]; //由于该变量需要大量空间,故需要定义成全局变量或者在函数中使用malloc动态申请变量空间
int main(int argc, char* argv[])
{
Date tmp;
int count=0; //记录天数
tmp.Day=1;
tmp.Month=1;
tmp.Year=0;
while(tmp.Year!=5001) //初始化每一天与0.1.1的日期差
{
buf[tmp.Year][tmp.Month][tmp.Day]=count;
tmp.nextday();
count++;
}
//下面就是根据题目要求的
int d1,m1,y1;
int d2,m2,y2;
while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF)
{
scanf("%4d%2d%2d",&y2,&m2,&d2);
printf("%d\n",abs(buf[y1][m1][d1]-buf[y2][m2][d2])+1);
}
return 0;
}
例2:九度1043
-
题目描述:
-
We now use the Gregorian style of dating in Russia. The leap years are years with number divisible by 4 but not divisible by 100, or divisible by 400.
For example, years 2004, 2180 and 2400 are leap. Years 2004, 2181 and 2300 are not leap.
Your task is to write a program which will compute the day of week corresponding to a given date in the nearest past or in the future using today’s agreement about dating.
-
输入:
-
There is one single line contains the day number d, month name M and year number y(1000≤y≤3000). The month name is the corresponding English name starting from the capital letter.
-
输出:
-
Output a single line with the English name of the day of week corresponding to the date, starting from the capital letter. All other letters must be in lower case.
-
样例输入:
-
9 October 2001 14 October 2001
-
样例输出:
-
Tuesday Sunday
#include<stdio.h>
#include<string.h>
#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0 //注意此处的宏定义写法!!
//定义每月天数,0空出来,1-12分别对应1月-12月
int dayOfMonth[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
};
//定义日期类,注意最后加逗号
struct Date{
int Year;
int Month;
int Day;
void nextday(){
Day++;
if(Day>dayOfMonth[Month][ISYEAP(Year)])
{
Day=1;
Month++;
if(Month>12)
{
Month=1;
Year++;
}
}
}
};
//定义月份名称,0空出去,1-12分别对应一月到12月
char monthName[13][20]={
"",
"January",
"February",
"March",
"April",
"May",
"Jun",
"July",
"August",
"September",
"October",
"November",
"December"
};
//定义星期名称,注意!0-6分别表示周日到周六!与下面对7求余对应
char weekName[7][20]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
//定义buf变量来存储每天的天数
int buf[5001][13][32];
int main(int argc, char* argv[])
{
//初始化Date
Date tmp;
tmp.Year=0;
tmp.Month=1;
tmp.Day=1;
int count=0;
while(tmp.Year!=5001)
{
buf[tmp.Year][tmp.Month][tmp.Day]=count;
tmp.nextday();
count++;
}
//以下为题目程序部分
int day;
char m[20];
int month;
int year;
while(scanf("%d %s %d",&day,m,&year)!=EOF)
{
int i;
for(i=0;i<13;i++) //得出月份数字
{
if(strcmp(m,monthName[i])==0)
{
month=i;
}
}
int days=buf[year][month][day]-buf[2018][1][28]; //计算与某一已知周一的日期差,可能有负数
printf("%s\n",weekName[(days%7+7)%7]); //保证星期为非负数
// puts(weekName[(days%7+7)%7]);
}
return 0;
}