• 【杭电】[1201]18岁生日


    这里写图片描述
    这里写图片描述

    关于这一题的初次见面感想:
    【算法】算法是一种思维

    这一题当时因为怕超时 所以并没有用循环
    (想想才只需要循环18次 怎么会超时……)

    于是写出了这样的一个代码:
    (多次WA)

    #include<stdio.h>
    int run(int m) {
        if(m%100==0) {
            if(m%400==0)
                return 1;
            else return 0;
        } else if(m%100!=0&&m%4==0)
            return 1;
        else
            return 0;
    }
    int main() {
        int T,y,m,d;
        int t;
        scanf("%d",&T);
        while(T--) {
            scanf("%d-%d-%d",&y,&m,&d);
            if(m==2&&d==29) {
                printf("-1
    ");
            } else if(run(y))
                if(m<=2)
                    printf("6575
    ");
                else
                    printf("6574
    ");
            else if(run(y+1))
                printf("6575
    ");
            else if(run(y+2))
                if(m<=2)
                    printf("6574
    ");
                else
                    printf("6575
    ");
            else if(run(y+3))
                printf("6574
    ");
        }
        return 0;
    }

    这种写法的前提是 闰年每四年一次
    然后这样只需要判断 当前年与后一年 后两年 后三年是否是闰年 便可以来分情况思考直接输出结果了
    毕竟答案只有 6574或者6575
    然而闰年并非严格4年1次
    百年不设闰 四百年设一闰

    所以思路假设前提就是错的 导致了代码出错
    于是决定老老实实地用循环来做:

    #include<stdio.h>
    int run(int m) {
        if((m%400==0)||(m%100!=0&&m%4==0))
            return 1;
        else
            return 0;
    }
    int main() {
        int T,y,m,d;
        scanf("%d",&T);
        while(T--) {
            scanf("%d-%d-%d",&y,&m,&d);
            int sum=0;
            if(m==2&&d==29) {
                printf("-1
    ");
            } else {
                if(m<=2) {
                    for(int i=0; i<18; i++) {
                        if(run(y++))
                            sum+=366;
                        else
                            sum+=365;
                    }
                } else {
                    for(int i=0; i<18; i++) {
                        if(run(++y))
                            sum+=366;
                        else
                            sum+=365;
                    }
                }
                printf("%d
    ",sum);
            }
        }
        return 0;
    }
    //用循环很轻松就AC了
    //当时为什么脑抽坚持直接判定呢……
    //有时候太强不是好事啊
    //对代码简洁的强迫症有时候真难办
    //一会再看看我那个代码究竟是错在哪里了 
    //(现在知道还是闰年的关系)

    同时顺手改了一下判定闰年的if语句
    让它看起来更舒服了一些

    题目地址:这里写链接内容

  • 相关阅读:
    7、配置私有仓库
    springcloud服务调用 list集合解析错误处理方法
    Mybatis-Plus 条件构造器的使用
    Mybatis-Plus 自定义sql
    Navicat Premium 15 安装与激活
    使用阿里云短信验证
    vue+element 表单el-radio单选框回显不能被选中问题
    类似性别(0、1)判断的table列表数据渲染
    使用docker 简单部署 ElasticSearch 以及 ElasticSearch-Head
    docker 配置镜像加速
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569915.html
Copyright © 2020-2023  润新知