昨天看习题,回忆起来之前初学C语言时被绊倒过的一个问题,今天就把它拿出来再理一遍,以警醒自己。顺便给不知道闰年的普及下(
估计也没人不知道
吧):
当时自以为思路比较清晰地直接把这段程序写出来了,殊不知运行时候才发现结果漏掉了几个闰年,程序跑出来240,实际数值却为243。为什么呢?#include <stdio.h> #include <stdlib.h> int main(void) { /*判断1000年到2000之间的闰年并输出*/ int year = 1000; int count = 0; for (year; year <= 2000; year++) //for循环从1000年到2000年 { if (year % 4 == 0) //若该year能被4整除 { if (year % 100 != 0)//若该year不能被100整除 { count++; printf("%d ",year); } } else if (year%400 == 0) //若该year能被400整除 { count++; printf("%d ", year); } } printf("\n%d\n", count); system("pause"); return 0; }
原因在当程序满足条件 (year%4 == 0)进入第一个 if 语句,又因不满足 (year%100 != 0)而退出,直接跳到下一次循环。讲到这里,就不难发现了,原来能
被 4 整除不能被 100 整除的年也有可能是闰年,比如 400 ,然而却因为 if 、 else的逻辑没有搞清楚而漏掉了这几条鱼。所以将该程序中的 else if 中的 else 删
掉,便能很好的解决这个问题。
还有另一种方法,更为简便,那就是用逻辑运算符:
int main(void) { /*判断1000年到2000之间的闰年并输出*/ int year = 1000; int count = 0; for (year; year <= 2000; year++) //for循环从1000年到2000年 { if ((year%4 == 0 && year%100 != 0) || year%400 == 0) { count++; printf("%d ", year); } } printf("\n%d\n", count); system("pause"); return 0; }
直接用一条语句判断,这样的逻辑是不是更简单清晰呢?
由这个问题看来不能小觑 if 语句的难度了!写程序,严谨性是必不可少的!