P5711 【深基3.例3】闰年判断

题目

写在开头:本题并不容易出错,但是需要一些常识,记录的目的也只是为了代码优化

原题目位于:[P5711 【深基3.例3】闰年判断 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)]

【深基3.例3】闰年判断

题目描述

输入一个年份,判断这一年是否是闰年,如果是输出 $1$,否则输出 $0$。

输入格式

输入一个正整数 $n$,表示年份。

输出格式

输出一行。如果输入的年份是闰年则输出 $1$,否则输出 $0$。

样例 #1

样例输入 #1

1926

样例输出 #1

0

样例 #2

样例输入 #2

1900

样例输出 #2

0

样例 #3

样例输入 #3

2000

样例输出 #3

1

样例 #4

样例输入 #4

1996

样例输出 #4

1

提示

数据保证,1582 <=n <=2020 且年份为自然数。

常识补充

引用自百度百科:[https://baike.baidu.com/item/闰年/27098?fr=ge_ala#6]

1582年以来公历的置闰规则:

普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。

世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。

对于上述代码

判定方法

公历闰年计算

(按一回归年365天5小时48分45.5秒)

1、非整百年份:能被4整除的是闰年。(如2004年就是闰年,2001年不是闰年)

2、整百年份:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)

3、对于数值很大的年份:如果这一年能被3200整除,那么这一年不是闰年,但如果这一年能被172800整除,则为闰年。如172800年是闰年,86400年不是闰年(因为虽然能被3200整除,但不能被172800整除)

代码及优化

针对于本题目的年份取值范围而言,根据普通的置闰规则就可以比较方便的解决了

#include<bits/stdc++.h>
int main()
{
    int year=0;
    scanf("%d",&year);
    printf("%d",(year%100!&&year%4==0)||(year%100==0&&year%400==0)?1:0);
    return 0;
}

针对于判定方法那三个规则而言,起初我写出了代码是下面这样(感觉我有搓屎山的潜力啊

#include<bits/stdc++.h>
int main()
{
	int flag = 0;
	int year = 0;
	int decision =0;
	scanf("%d",&year);
	if(year%172800==0) { flag = 1;decision=1;}
	if(!decision&&year%3200==0) {flag=0;decision=1;}
	if(!decision&&year%400==0) {flag=1;decision=1;}
	if(!decision&&year%100==0) {flag=0;decision=1;}
	if(!decision&&year%4==0) {flag=1;decision=1;}
	printf("%d",flag);
	return 0; 
}

但是这种写法未免太过繁琐,因此参考第一种写法

#include<bits/stdc++.h>
int main()
{
    int year = 0;
    scanf("%d",&year);
    int flag = year%172800==0||(year%3200!=0&&year%400==0)||(year%100!=0&&year%4==0)?1:0;
    printf("%d",flag);
    return 0;
}

相对于刚刚的写法会简明一点。这种优化的方法是只关心是闰年的条件,将满足的年份判断为闰年,其余年份都不是闰年。

posted @   於戏  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示