2、日期问题
日期类运算的各种问题同样被频繁地选入机试考题中,但这类问题通常都有规律可循。只
要能够把握这类问题题面中的核心规律,求解这类问题就不会有太大的难度
关键:1、数组;2、循环;---->熟练调试代码
1)year 是否是闰年:year%400==0 || year%100!=0 && year%4==0 (eg:2014,注意&&的优先级高于|| )
2)月中有多少天:辅助数组把月份提前输入 eg:mday [13]={......} 空间换时间
今年的第几天?(清华复试上机)
题目描述:
输入年、月、日,计算该天是本年的第几天。
输入: 包括 3
个整数:年(
1<=
Y <=
3000
)、月(
1 <=
M <=
12
)、日(
1 <=
D <=
31
)。
输出: 输入可能有多组测试数据,对于每组测试数据,
输出一个整数,代表
Input
中的年、月、日对应本年的第几天。
样例输入: 1990 9 20
2000 5 1
样例输出: 263
122
代码表示:
#include <iostream>
using namespace std;
int main() {
int year,mon,day;
int mday[13]={0,31,28,31,30,31,31,30,31,30,31};
int totalDay[13]={0};
for(int mon=2;mon<=12;++mon){
//到mon月1日的天数=到mon-1月1日的天数+第mon-1月的天数
totalDay[mon]=totalDay[mon-1]+mday[mon-1];
}
while(scanf("%d%d%d",&year,&mon,&day)!=EOF){
//如果是闰年
bool isleap=year%400==0||year%100!=0&&year%4==0;
if(isleap==true && mon>=3){//对超过2月的有影响
printf("%d\n",totalDay[mon]+day+1);
}
else{
printf("%d\n",totalDay[mon]+day);
}
}
}
打印日期(华中科技大学复试上机题)
题目描述:
给出年份
m
和一年中的第
n
天,算出第
n
天是几月几号。
输入: 输入包括两个整数:y
(
1 <=
y <=
3000
)和
n
(
1 <=
n <=
366
)。
输出: 可能有多组测试数据,对于每组数据,
按格式
yyyy-mm-dd
将输入中对应的日期打印出来。
样例输入:
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 main(){
int year,n;
int mday[13]={0,31,28,31,30,31,31,30,31,30,31};
while(scanf("%d%d",&year,&n)!=EOF){
int mon=1;
int day=1;
for(int i=0;i<n;++i){
bool isleap=year%400==0||year%100!=0&&year%4==0;
if(isleap){
mday[2]=29;
}
else{
mday[2]=28;
}
//下一天
++day;
if(day>mday[mon]){//到了32号了
++mon;
day=1;
if(mon>12){//到了13月
mon=1;
++year;
}
}
}
printf("%4d-%02d-%02d\n",year,mon,day);
}
}
日期累加(北京理工大学复试上机题)
题目描述:
设计一个程序,它能够计算一个日期加上若干天后是什么日期。
输入: 输入第一行表示样例个数 m
,接下来的
m
行中,每行
4
个整数,分别表示年、月、日和累加的天数。
输出: 输出 m
行,每行按
yyyy-mm-dd
的个数输出。
样例输入:
1
2008 2 3 100
样例输出:
2008-05-13
代码表示:
#include <iostream>
#include <cstdio>
using namespace std;
int daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 普通年每个月的天数
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} // 闰年每个月的天数
};
bool IsLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int NumberOfYear(int year) { //返回该年天数
if (IsLeapYear(year)) {
return 366;
} else {
return 365;
}
}
int main() {
int year, month, day;
int number; //记录天数
int caseNumber; //组数
scanf("%d", &caseNumber); // 输入组数
while (caseNumber--) {
scanf("%d%d%d%d", &year, &month, &day, &number); // 输入年、月、日和天数
int row = IsLeapYear(year);
for (int j = 0; j < month; ++j) {
number += daytab[row][j]; // 计算给定日期在一年中的天数
}
number += day;
while (number > NumberOfYear(year)) { //确定年
number -= NumberOfYear(year);
year++;
}
month = 1; // 修正月份从1开始
row = IsLeapYear(year);
while (number > daytab[row][month]) { //确定月
number -= daytab[row][month];
month++;
}
day = number; //确定日
printf("%04d-%02d-%02d\n", year, month, day); // 输出日期
}
return 0;
}