日期计算

日期计算方法

日期计算

时间限制: 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. }

对比分析:
优秀代码模拟数数,从那一年的第一天开始数。算是简单暴力了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值