您的位置:首页 > 其它

题目1070:今年的第几天?

2015-07-05 17:26 309 查看
题目描述:

输入年、月、日,计算该天是本年的第几天。

输入:

包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。

输出:
输入可能有多组测试数据,对于每一组测试数据,
输出一个整数,代表Input中的年、月、日对应本年的第几天。

样例输入:
1990 9 20
2000 5 1


样例输出:
263
122


#include <iostream>
#include <stdio.h>
using namespace std;

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
};

int buff[3001][13][32];

int isRunnian(int year){
return year % 400 == 0 ? 1 : (year % 4 == 0 && year % 100 != 0) ? 1 : 0;

}

struct Date{
int year;
int month;
int day;
void nextDay(){
day++;
if(day > dayOfMonth[month][isRunnian(year)]){
day = 1;
month++;
}
if(month > 12){
month = 1;
year++;
}

}
};

int main()
{
Date date;
date.year = 1;
date.month = 1;
date.day = 1;
int cnt = 1,tempYear=1;
while(date.year < 3001){
// cout << date.year<< " " << date.month << " " << date.day << endl;
if(date.year != tempYear){
//cout << tempYear << " " << cnt << endl;
tempYear = date.year;
cnt = 1;
}
buff[date.year][date.month][date.day] = cnt;
date.nextDay();
cnt++;
}
int y,m,d;
while(scanf("%d%d%d",&y,&m,&d)!=EOF){
printf("%d\n",buff[y][m][d]);
}
return 0;
}


做日期型的题目都有相似的策略,将每个日期对应的值,建立一棵hash树,并且没有结点重复,处理相对比较容易

下面代码就是建树过程:

while(date.year < 3001){
// cout << date.year<< " " << date.month << " " << date.day << endl;
if(date.year != tempYear){
//cout << tempYear << " " << cnt << endl;
tempYear = date.year;
cnt = 1;
}
buff[date.year][date.month][date.day] = cnt;
date.nextDay();
cnt++;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: