日期计算
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
如题,输入一个日期,格式如:2010 10 24 ,判断这一天是这一年中的第几天。
-
输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每行的输入数据都是一个按题目要求格式输入的日期。 输出
- 每组输入数据的输出占一行,输出判断出的天数n 样例输入
-
3 2000 4 5 2001 5 4 2010 10 24
样例输出
-
96 124 297
来源
- [naonao]改编C语言习题 上传者
-
naonao
问题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=75问题分析:题目没有给出时间的范围,算是一个小小的bug。按照日期计算的套路,先计算去0/1/1到2020/12/31之间每一天到原点的天数 ,然后利用这些数据直接进行计算即可。代码:
优秀代码:#include <stdio.h> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ #define ISYEAP(x) x%100 !=0 && x%4==0 ||x%400==0?1:0 int dayOfMonth[13][2]={ 0,0, 31,31,//1 28,29,//2 31,31,//3 30,30,//4 31,31,//5 30,30,//6 31,31,//7 31,31,//8 30,30,//9 31,31,//10 30,30,//11 31,31//12 }; 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 buf[2021][13][32]; //预存0/1/1到2020/12/31之间每一天到原点的天数 int main(int argc, char *argv[]) { Date start; int count=0; //计数 start.day=1; start.month=1; start.year=0; while(start.year != 2020) { buf[start.year][start.month][start.day]=count; count++; start.nextDay(); } int N; scanf("%d",&N); while(N--) { int y,m,d; scanf("%d%d%d",&y,&m,&d); printf("%d\n",buf[y][m][d]-buf[y][1][1]+1); } return 0; }
01.
#include<stdio.h>
02.
int
main()
03.
{
04.
int
a,b=0,c,y,m,d,fib;
05.
scanf
(
"%d"
,&a);
06.
while
(a--)
07.
{
08.
scanf
(
"%d %d %d"
,&y,&m,&d);
09.
if
(y%400==0||y%100!=0&&y%4==0)
10.
fib=29;
11.
else
fib=28;
12.
for
(c=1;c<=m;c++)
13.
switch
(c-1)
14.
{
15.
case
1:
16.
case
3:
17.
case
5:
18.
case
7:
19.
case
8:
20.
case
10:b+=31;
break
;
21.
case
2:b+=fib;
break
;
22.
case
4:
23.
case
6:
24.
case
9:
25.
case
11:b+=30;
break
;
26.
}
27.
b+=d;
28.
printf
(
"%d\n"
,b);
29.
b=0;
30.
}
31.
return
0;
32.
}
对比分析:优秀代码模拟数数,从那一年的第一天开始数。算是简单暴力了。