【杭电】[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语句
让它看起来更舒服了一些

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

原文地址:https://www.cnblogs.com/BoilTask/p/12569914.html