【杭电】[1201]18岁生日
2016-01-16 01:54
239 查看
关于这一题的初次见面感想:
【算法】算法是一种思维
这一题当时因为怕超时 所以并没有用循环
(想想才只需要循环18次 怎么会超时……)
于是写出了这样的一个代码:
(多次WA)
[code]#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\n"); } else if(run(y)) if(m<=2) printf("6575\n"); else printf("6574\n"); else if(run(y+1)) printf("6575\n"); else if(run(y+2)) if(m<=2) printf("6574\n"); else printf("6575\n"); else if(run(y+3)) printf("6574\n"); } return 0; }
这种写法的前提是 闰年每四年一次
然后这样只需要判断 当前年与后一年 后两年 后三年是否是闰年 便可以来分情况思考直接输出结果了
毕竟答案只有 6574或者6575
然而闰年并非严格4年1次
百年不设闰 四百年设一闰
所以思路假设前提就是错的 导致了代码出错
于是决定老老实实地用循环来做:
[code]#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\n"); } 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\n",sum); } } return 0; } //用循环很轻松就AC了 //当时为什么脑抽坚持直接判定呢…… //有时候太强不是好事啊 //对代码简洁的强迫症有时候真难办 //一会再看看我那个代码究竟是错在哪里了 //(现在知道还是闰年的关系)
同时顺手改了一下判定闰年的if语句
让它看起来更舒服了一些
题目地址:这里写链接内容
相关文章推荐
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
- 高知名度企业不完全列表
- 高知名度企业不完全列表
- maven install项目时报错“编码 gbk 的不可映射字符”的原因与解决办法
- 【杭电】[1994]利息计算
- 极路由1s,固件需要刷入RipOS系统的加40块
- 极路由1s,固件需要刷入RipOS系统的加40块
- JMS介绍:我对JMS的理解和认识
- App架构设计经验谈:服务端接口的设计
- 缓冲区的个人理解
- oracle EM证书错误ssl_error_weak_server_cert_key
- 第四篇文章
- 2016极客公园创新大会有感
- 2015年,Facebook排名前5的开源项目
- New UI-带阴影的TextView
- New UI-带边框的TextView
- New UI-Java代码动态添加控件或xml布局
- New UI-纯Java代码加载布局
- 小猪的Android入门之路——目录(持续更新)
- New UI-关于布局优化集锦