GitBook

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

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

这一题当时因为怕超时 所以并没有用循环 (想想才只需要循环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\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次 百年不设闰 四百年设一闰

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

#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语句 让它看起来更舒服了一些

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