c语言 日期差值无法通过?
这是问题http://ac.jobdu.com/problem.p...
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
struct tm t1;
struct tm t2;
int y1, m1, d1;
int y2, m2, d2;
while(scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
scanf("%4d%2d%2d", &y2, &m2, &d2);
t1.tm_mday = d1;
t1.tm_mon = m1;
t1.tm_mon--;
t1.tm_year = y1;
t1.tm_year -= 1900;
t2.tm_mday = d2;
t2.tm_mon = m2;
t2.tm_mon--;
t2.tm_year = y2;
t2.tm_year -= 1900;
t1.tm_sec = 0;
t1.tm_min = 0;
t1.tm_hour = 0;
t1.tm_isdst = -1;
t2.tm_sec = 0;
t2.tm_min = 0;
t2.tm_hour = 0;
t2.tm_isdst = -1;
int k1 = mktime(&t1);
int k2 = mktime(&t2);
int k3 = (k1 - k2) / 3600 / 24;
if (k3 < 0) {
k3 = -k3;
}
printf("%d\n", k3 + 1);
}
return 0;
}
我自己电脑上运行正确,可OJ无法通过,求大神指教。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这个题目出真是简单粗暴。
不建议用mktime,因为mktime有时间范围限制,如果时间表示不了,会返回-1的。
比如32位Linux中,只能到2038年,64位的则可以到3000年。
此外有些实现(如VC++)对于Unix Epoch(1970年1月1日午夜)之前的时间会也会返回-1。
所以你最好还是自己处理。题目的意思应该是让你把年月日分别相减,并相互借位。
其实这道题仔细追究会有很多问题的,毕竟不严谨。
比如公元46年到1582年使用的是儒略历,之后用的是格高里历,两者切换的1582年10月份,有些日期其实是不存在的等。
谢谢邀请. 好久没有上OJ了. 账号密码都忘记了. 好记性不如烂笔头, 翻了一下,找到账号, 登录验证了. 确实是
Wrong answer.
Wrong answer
在OJ中,有明确的说明,如下:再想想遗漏了什么特殊的数据? 而且我发现, 你的程序可以接收错误的日期. 却能得出结果.
OJ 其他错误说明
我也考虑一下. 如果您是研究生的话, 祝福面试成功!
这个结果肯定不对的. 我觉得还是你的算法有问题. 而且如果日期相同呢? 是0? 还是1?
这个应该也是错误的. 问题已经知道了. 方法还是再努力一下吧.
这是两年前编程之美预赛第一题,当时并没想到正确的解法,漏洞百出。
后来问了同学,解法是暴力自增日期,这样编写代码最为简洁。因为每月天数不同,每年闰/平年会有变化,逢非四百年的百年还要省去一个闰天,考虑因素太多,不如直接自增。
天数变化是四百年一个轮回,所以先将年份约束在四百年内。每四百年(例如
1600-1999
),共97
个闰年,303
个平年,97*366+303*365=146097
,先取(year2-year1)/400 * 146097
。接下来再自增,复杂度并不算高,不过这种题边界条件容易出错,需要多注意一下,具体代码我就不贴了。