算法總結——判斷閏年

問題描述

判斷某年是否是閏年。公曆紀年法中,能被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’寫在雙引號中,如前面給出的參考程序。
問題五:其它還有一些編譯出錯、提交時選錯題目、選錯編譯語言等問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章