关于这一题的初次见面感想:
【算法】算法是一种思维
这一题当时因为怕超时 所以并没有用循环
(想想才只需要循环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语句
让它看起来更舒服了一些
题目地址:这里写链接内容