C语言实现:查找1300~1400区间输入年份的最近闰年
C语言闰年判断及最近闰年查找实现方案
原有代码问题修正
- 原代码中
while(1300<year<1400)的写法不符合C语言语法:该表达式会先计算1300<year得到布尔值0/1,再与1400比较,结果永远为真,会触发死循环,需要修改为year > 1300 && year < 1400 - 缺失完整的闰年判断逻辑,标准判定规则如下:
- 能被400整除的年份是闰年
- 能被4整除但不能被100整除的年份是闰年
- 其余情况均为非闰年
你要求的输入范围是1300<y<1400,该区间内不存在整百年份(整百年1300、1400都不在输入范围内),补全的整百年判断逻辑可以兼容所有场景,无需针对该区间做特殊处理。
完整实现代码
#include <stdio.h> // 闰年判断函数,是闰年返回1,否则返回0 int is_leap(int year) { if (year % 400 == 0) { return 1; } if (year % 100 == 0) { return 0; } if (year % 4 == 0) { return 1; } return 0; } int main() { int year, offset; printf("请输入年份:"); scanf("%d", &year); // 输入范围校验 if (year <= 1300 || year >= 1400) { printf("输入错误,请输入1301~1399之间的年份\n"); return 1; } // 先判断当前年份是否为闰年 if (is_leap(year)) { printf("%d年是闰年\n", year); return 0; } // 查找最近的闰年,offset从1开始递增 offset = 1; while(1) { // 先检查更早的年份,若要优先取更晚的可以调换两个判断的顺序 if (is_leap(year - offset)) { printf("%d年不是闰年,最近的闰年是%d年,距离%d年\n", year, year - offset, offset); break; } if (is_leap(year + offset)) { printf("%d年不是闰年,最近的闰年是%d年,距离%d年\n", year, year + offset, offset); break; } offset++; } return 0; }
代码逻辑说明
- 优先做输入合法性校验,不符合范围直接提示错误退出
- 单独封装
is_leap函数实现闰年判断,整百年的判断逻辑在函数中已经完整实现 - 查找最近闰年时从步长1开始递增,同时检查当前年份加减步长的结果,找到第一个符合条件的就输出。若前后两个闰年距离相同,默认优先输出更早的闰年,调换两个
is_leap判断的顺序即可改为优先输出更晚的闰年。
内容的提问来源于stack exchange,提问作者Amirhossein Behrad
相关产品推荐
相关产品推荐

