01 洛谷 P2010 回文日期

2020-07-19  本文已影响0人  _Mirage

题目链接

题目不难,但是由于粗心大意提交了3次才完全正确,记录下。

  1. 第一次错误: 判断日期合法性错误: 只考虑了月份和日期合法的情况(在1-9之间这样的)。没有考虑具体每个月有多少天等等。最后既有结果错误,也有超时: image.png

    看到超时我就想这题肯定会有我没想到的更好的解法。(毕竟我是真的菜。。)

  2. 第二次错误: 更改了检查日期合法性后,其他测试点都通过了,只剩下最后一个超时的测试点没通过,我就得重新构思下算法: image.png
我当前判断是否为回文数的函数是: image.png

就是最原始的暴力判断,用了一个数组当中间变量,可能也是这些多余的数组操作导致超时很多。

后面仔细想了一下,题目其实给的数据很有规律,其实就是8位数,固定死了,然后我觉得就可以不用数组了,直接暴力赋值: image.png
经过这样的更改后才侥幸过关。
  1. 第三次提交:虽然勉强过了,但还是有很大的优化空间,这次提交能过真的完全是侥幸,卡在了超时的边缘: image.png

也没有深入去想了(毕竟想也想不出来),等到日后自己水平有所提高后再来尝试更优秀的方法吧!

源代码如下:

#include<cstdio>


bool run_year(int num) {
    if((num % 4 == 0 && num % 100 != 0) || (num % 400 == 0)) return true;
    return false;
}

bool check_valid(int num) {
    int year, month, day;
    year = num / 10000;
    month = num % 10000 / 100;
    day = num % 100;
    if(month > 12 || month == 0 || day == 0) return false;
    if(month == 4 || month == 6 || month == 9 || month == 11) {
        if(day <= 30) return true;
    }
    else if(month == 2) {
        if(run_year(year)) {
            if(day <= 29) return true;
        }
        else {
            if(day <= 28) return true;
        }
    }
    else {
       if(day <= 31) return true;
    }
    return false;
}

bool check_huiwen(int num) {
    int a, b, c, d;
    int aa, bb, cc, dd;
    a = num / 10000000;
    aa = num % 10;
    if(a != aa) return false;
    b = num / 1000000 % 10;
    bb = num / 10 % 10;
    if(b != bb) return false;
    c = num / 100000 % 10;
    cc = num / 100 % 10;
    if(c != cc) return false;
    d = num / 10000 % 10;
    dd = num / 1000 % 10;
    if(d != dd) return false;
    return true;
}

int solve(int a, int b) {
    int cnt = 0;
    for(int i = a; i <= b; i++) {
        if(check_valid(i)) {
            if(check_huiwen(i)) cnt++;
        }
    }
    return cnt;
}

int main(int argc, char const *argv[])
{
    int date1, date2;
    scanf("%d%d", &date1, &date2);
    printf("%d", solve(date1, date2));

    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读