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;
}
相对于刚刚的写法会简明一点。这种优化的方法是只关心是闰年的条件,将满足的年份判断为闰年,其余年份都不是闰年。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)