个人觉得日期相关题目是有点烦的(基本上会用到结构体什么的,处理月份也好烦啊hhh),于是想特意整理一期
例题
打鱼晒网:
中国有句俗语:“三天打鱼两天晒网”,某人从2000年1月1日起开始“三天打鱼两天晒网”,打鱼和晒网是连续进行的。
问这个人在以后的某一天是在“打鱼”还是在“晒网”?
用下面结构体表述日期:
struct Date{
int year;
int month;
int day;
};
Input:
2000-11-3
Output:
打鱼
Input:
2000-2-29
Output:
晒网
这题也是很经典了。。。
#include <bits/stdc++.h>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
//判断某一年是否为闰年
int isRunNian(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
{
return 1;
}
else
{
return 0;
}
}
//计算日期与起始日期之间的天数差
int JiSuanDays(struct Date date,struct Date startDate)
{
int days=0;
//计算整年的天数差
for(int i=startDate.year;i<date.year;i++)
{
days+=isRunNian(i)?366:365;
/*
//等价于下面的语句
if(isRunNian(i))
{
days+=366;
}
else
{days+=365;}
*/
}
//计算当年的天数差
for(int i=1;i<date.month;i++)
{
if(i==2)
{
days+=isRunNian(date.year)?29:28;
}
else if(i==4||i==6||i==9||i==11)
{
days+=30;
}
else
{
days+=31;
}
}
days+=date.day-1;
/*将目标日期的日数减去1(因为计算天数差时是从0开始算的),
然后累加到 days 变量中
这样days 就代表了从起始日期到目标日期的总天数*/
return days;
}
int main()
{
struct Date date;
struct Date startDate={2000,1,1};
scanf("%d-%d-%d",&(date.year),&(date.month),&(date.day));
int days=JiSuanDays(date,startDate);
if(days%5<3)
{
printf("打鱼\n");
}
else
{
printf("晒网\n");
}
return 0;
}
林大oj 414 第几天?
Description
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有1组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
1985/1/20
Sample Output
20
#include<bits/stdc++.h>
using namespace std;
int fun(int a)
{
if ((a% 4 == 0 && a% 100 != 0) ||a% 400 == 0)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int a, b,c;
scanf("%d/%d/%d", &a, &b, &c);
int Month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sumDays = c;
for (int i = 1;i<b; i++)
{
sumDays+= Month[i - 1];//Month[0] 是1月的天数,数组下标从0开始
}
if (fun(a) ==1&& b> 2)
{
sumDays += 1;
/*如果输入年份 a 是闰年(fun(a) == 1)
且输入月份 b 大于2(即在3月及以后),
则将总天数 sumDays 加一,因为闰年的2月份多一天*/
}
printf("%d\n",sumDays);
return 0;
}
林大oj 233 生日日期
Description
小甜甜的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。
Input
多组输入
每组包含YY,MM,DD其中1949<=YY<=2002,日期绝对合法。
Output
每组输出只有一行,即小甜甜生日第一万天以后的日期,格式为 “YY-MM-DD”。
Sample Input
1975 7 15
Sample Output
2002-11-30
#include<bits/stdc++.h>
using namespace std;
int fun(int n)
{ //判断闰年
if ((n%4==0&&n%100!=0)||n%400==0)
return 1;
return 0;
}
int Month(int n,int y) { //判断月份天数
int num=0;
if(n==1||n==3||n==5||n==7||n==8||n==10||n== 12)
num=31;
if(n==4||n==6||n==11||n==9)
num += 30;
if(fun(y)==1&&n==2)
num = 29;
else if (fun(y)==0&&n==2)
num = 28;
return num;
}
int main()
{
int y=0,m=0,d=0;
int n=10000;
while(scanf("%d%d%d", &y, &m, &d) != -1)
{
for (int i=1;i<=n;i++)
{
d++;
if(d>Month(m,y))
{
d-=Month(m, y);
m++;//月份更新
if(m>12)
{
m=1;
y++;//年份更新
}
}
}
printf("%d-%d-%d\n", y, m, d);
}
return 0;
}
林大oj 2068 出生日期
Description
班主任想统计大一同学的出生日期,并想按照同学的如期从大到小进行排序。可是班主任最近科研任务很重,时间不够,所以请你帮帮他。
Input
有2行,
第1行为学生总人数n;
第2行至第n+1行分别是同学的姓名s、出生年y、月m、日d。
Output
输出n行,
为从大到小同学的姓名。(注:如果有两个同学生日相同,输入靠后的同学先输出)
Sample Input
3
LiYanhu 1992 4 23
Qiujbojun 1993 10 13
Lixunhuan 1991 8 1
Sample Output
Lixunhuan
LiYanghu
Qiubojun
#include <bits/stdc++.h>
using namespace std;
struct Date
{
string name;
int y,m,d,id;
}p[1005];
bool cmp(Date a,Date b)
{
if(a.y!=b.y)
return a.y<b.y;
else if(a.m!=b.m)
return a.m<b.m;
else if(a.d!=b.d)
return a.d<b.d;
return a.id>b.id;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
p[i].id=i+1;
cin>>p[i].name>>p[i].y>>p[i].m>>p[i].d;
}
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
cout<<p[i].name<<endl;
}
return 0;
}
这里用到了sort排序,可以看我之前发的博客