浙大版《C语言程序设计(第3版)》题目集 练习3-5 输出闰年 (15 分)

时间:2021-03-17 19:19:31
练习3-5 输出闰年 (15 分)

输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:

输入在一行中给出21世纪的某个截止年份。

输出格式:

逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。

输入样例1:

2048

输出样例1:

2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048

输入样例2:

2000

输出样例2:

Invalid year!


思路:2000年属于20世纪,21世纪从2001年开始,然后利用提给的判断闰年方法进行判断。


代码如下:
#include<stdio.h>
int main ()
{	
    int year, i, count=0;

    scanf("%d",&year);
    if(year<=2000||year>2100) 
    {
	printf("Invalid year!");
	return 0;
    }
    for (i=2001;i<=year;i++)
    {
	if (i%4==0&&i%100!=0)
        {
            count++;
            printf("%d\n",i);
        }
    }
    if(count==0)
	printf("None");
	
    return 0;
}        

 科普:

  闰年闰年是比普通年分多出一段时间的年分,在各种历法中都有出现,目的是为了弥补人为规定的纪年与地球公转产生的差异。

  闰年规则目前使用的格里高利历闰年规则如下:

  1. 公元年分除以4不可整除,为平年。
  2. 公元年分除以4可整除但除以100不可整除,为闰年。
  3. 公元年分除以100可整除但除以400不可整除,为平年。
  4. 公元年分除以400可整除但除以3200不可整除,为闰年。

  每逢闰年,2月有29日,平年的2月为28日。

  因此,1977年为平年,1980年逢4的倍数为闰年,1900年逢100的倍数但非400的倍数故为平年,2000年逢400的倍数又为闰年。

此外,如依照现有太阳年的长度与上述闰年规则,每8000年又约差一日,因此约翰·赫歇尔提议每逢4000的倍数不闰,如公元4000年。但距此年分来临尚有约二千年之遥,因此还未曾真正纳入规则或实施过。又由于地球公转速度的不稳定与众多影响因素,届时是否需要纳入此规则有待商榷。

  公元前的闰年

  公元前之闰年出现在前1, 前5, 前9, 前13, ...,或记作1 BC,5 BC,9 BC,13 BC,...,或在数轴上记作0,-4,-8,-12,...。 判断是否闰年,须将年份值减1再以“除以4”计算,或以数轴记法表示时直接计算(正负性不影响是否整除)。(因为没有公元0年这一年(除非临时约定,并注明对应等式),所以公元前1, 2, 3, 4, ... 年应该在数学数轴上对应着(但不是,或不应该在历法上称)公元0, -1, -2, -3, ... 年,而公元前1, 5, 9, 13, ... 年在数学数轴上对应着0, -4, -8, -12, ... 年,为4的倍数)。 记住:临时约定的数学“0”年,等于天文学固有的“0”年,等于历法公元前一年。

  来源:*-闰年(https://zh.wikipedia.org/wiki/%E9%97%B0%E5%B9%B4)