算法总结——判断闰年

问题描述

判断某年是否是闰年。公历纪年法中,能被4整除的大多是闰年,但能被100整除而不能被400整除的年份不是闰年,如1900年是平年,2000年是闰年。
输入数据
一行,仅含一个整数a(0 < a < 3000)。
输出要求
一行,如果公元a年是闰年输出Y,否则输出N。
输入样例
2006
输出样例
N

解题思路

这个题目主要考察闰年的定义,使用基本的逻辑判断语句就可以了。考虑到输入的范围在0到3000之间,所以判断闰年时不必考虑能被3200整除的年份不是闰年的判定条件。
程序应该包括三个基本的步骤:正确读入要判定的年份a;判定a是否为闰年;给出正确的输出。其中,判断输入年份是否为闰年根据个人的思考习惯可以有不同的判定顺序。
参考解法一 – 分段排除:
如果a % 4 ! = 0,则a不是闰年;
否则如果a % 100 == 0 && a % 400 != 0,则a不是闰年;
否则a是闰年。
参考解法二 – 列出所有闰年的可能条件,满足条件则为闰年,否则判为非闰年:
如果 (a % 400 == 0 || (a % 4 == 0 && a % 100 != 0)),  则a是闰年;否则 a不是闰年。

参考程序一:

#include <stdio.h>
void main()
{
	int a; //记录待判定的年份
	scanf("%d", &a);
	if(a % 4 != 0)  
        printf("N\n");
    else if(a % 100 == 0 && a % 400 != 0)
              printf("N\n");
	else 
	     printf("Y\n");
}

参考程序二:

#include <stdio.h>
void main(){
	int a;
    scanf("%d", &a);
	if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) 
         printf("Y\n");
	else
         printf("N\n");
}

实现中常见的问题

问题一:代码冗长,不必要的变量定义
1. #include <stdio.h>
2. void main() 
3. {
4. int year, a, b, c;
5. scanf("%d", &year);
6. a = year % 4;
7. b = year % 100;
8. c = year % 400;
9. if (a != 0){
10. printf("N\n");
11. }
12. if (a == 0 && b != 0){
13. printf("Y\n");
14. }
15. if(b == 0 && c != 0){
16. printf("N\n");
17. }
18. if(c == 0){
19. printf("Y\n");
20. }
21. }
分析:1. 不必定义变量a,b,c,可以直接在判断语句里写表达式;
      2.可以用 ‘&&’ 将 输出 ‘Y’ 和 ‘N’的情况合并,使代码更简洁清晰;
      
问题二:逻辑错误
1. #include<stdio.h>
2. void main()
3. {
4. int n;
5. scanf("%d", &n);
6. if(n % 400 == 0)   printf("Y");
7.    else if(n % 4 == 0)   printf("Y");
8. else printf("N");
9. }
    分析:没有判断能被100整除但不能被400整除的情况。


问题三:用错运算符
1. #include<stdio.h>
2. void main()
3. {
4. int n;
5. scanf("%d", &n);
6. if(n / 4 == 0){
7. if(n / 400 == 0)  printf("Y\n");
8. else if(n / 100 == 0)  printf("N\n");
9. else         printf("Y\n");
10. }else printf("N\n");
11.
12. }
分析:判断一个数是否能被另一个数整除应该用整数取模用算,而不是整数除法。


问题四:c和 c++的输出混用,造成输出有误


1. #include <stdio.h>
2. void main()
3. {
4. int year;
5. scanf("%d", &year);
6. bool judge;
7. judge = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
8. if (judge)  printf("%c",'Y');
9. else printf("%c",'N');
10. printf(“\n”);;
11. }
分析:1. 在<stdio.h>中定义的c的输入输出函数不能与<iostream.h>中定义的c++的输入输出函数混用,因为它们使用不同的缓冲区,在输出的时候有可能不按代码中出现的顺序输出。所以在程序中不要同时使用c和c++的输入输出语句。
2. 用prinf输出 ‘Y’ 和 ‘N’ 时,因为是常量不是变量,所以不必用%c可以直接将‘Y’ 和 ‘N’写在双引号中,如前面给出的参考程序。
问题五:其它还有一些编译出错、提交时选错题目、选错编译语言等问题。
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值