c语言 日期差值无法通过?

发布于 2022-09-04 10:25:47 字数 1118 浏览 14 评论 0

这是问题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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

江南月 2022-09-11 10:25:47

这个题目出真是简单粗暴。
不建议用mktime,因为mktime有时间范围限制,如果时间表示不了,会返回-1的。
比如32位Linux中,只能到2038年,64位的则可以到3000年。
此外有些实现(如VC++)对于Unix Epoch(1970年1月1日午夜)之前的时间会也会返回-1。
所以你最好还是自己处理。题目的意思应该是让你把年月日分别相减,并相互借位。

其实这道题仔细追究会有很多问题的,毕竟不严谨。
比如公元46年到1582年使用的是儒略历,之后用的是格高里历,两者切换的1582年10月份,有些日期其实是不存在的等。

素罗衫 2022-09-11 10:25:47

谢谢邀请. 好久没有上OJ了. 账号密码都忘记了. 好记性不如烂笔头, 翻了一下,找到账号, 登录验证了. 确实是Wrong answer.

Wrong answer在OJ中,有明确的说明,如下:

Wrong Answer : 答案不对,仅仅通过样例数据的测试并不一定是正确答案,一定还有你没想到的地方。

再想想遗漏了什么特殊的数据? 而且我发现, 你的程序可以接收错误的日期. 却能得出结果.

OJ 其他错误说明

Pending : 系统忙,你的答案在排队等待。
Pending Rejudge : 因为数据更新或其他原因,系统将重新判你的答案。
Compiling : 正在编译。
Running & Judging : 正在运行和判断。
Accepted : 程序通过!
Presentation Error : 答案基本正确,但是格式不对。
Wrong Answer : 答案不对,仅仅通过样例数据的测试并不一定是正确答案,一定还有你没想到的地方。
Time Limit Exceeded : 运行超出时间限制,检查下是否有死循环,或者应该有更快的计算方法。
Memory Limit Exceeded : 超出内存限制,数据可能需要压缩,检查内存是否有泄露。
Output Limit Exceeded : 输出超过限制,你的输出比正确答案长了两倍。
Runtime Error : 运行时错误,非法的内存访问,数组越界,指针漂移,调用禁用的系统函数。
Compile Error : 编译错误,请点击后获得编译器的详细输出。

我也考虑一下. 如果您是研究生的话, 祝福面试成功!


00010101

99991231

这个结果肯定不对的. 我觉得还是你的算法有问题. 而且如果日期相同呢? 是0? 还是1?

10010101

99991231

这个应该也是错误的. 问题已经知道了. 方法还是再努力一下吧.

魄砕の薆 2022-09-11 10:25:47

这是两年前编程之美预赛第一题,当时并没想到正确的解法,漏洞百出。

后来问了同学,解法是暴力自增日期,这样编写代码最为简洁。因为每月天数不同,每年闰/平年会有变化,逢非四百年的百年还要省去一个闰天,考虑因素太多,不如直接自增。

天数变化是四百年一个轮回,所以先将年份约束在四百年内。每四百年(例如1600-1999),共97个闰年,303个平年,97*366+303*365=146097,先取(year2-year1)/400 * 146097。接下来再自增,复杂度并不算高,不过这种题边界条件容易出错,需要多注意一下,具体代码我就不贴了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文