昨天看習題,回憶起來之前初學C語言時被絆倒過的一個問題,今天就把它拿出來再理一遍,以警醒自己。順便給不知道閏年的普及下(估計也沒人不知道
吧):
#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; }
當時自以為思路比較清晰地直接把這段程式寫出來了,殊不知運作時候才發現結果漏掉了幾個閏年,程式跑出來240,實際數值卻為243。為什麼呢?
原因在當程式滿足條件 (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 語句的難度了!寫程式,嚴謹性是必不可少的!