题目:
找到1000~3000年中的所有闰年
闰年有2种:
- 普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
- 世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
分析:
我们可以建立一个循环,然后在循环的内部进行判断,符合的2种闰年条件的,即为闰年。
然后通过题目,我们可以简单地想出2种建立循环的方法:
- 遍历1000~3000年中的所有年份,符合条件即为闰年。时间复杂度 == O(n)
- 直接遍历1000~3000中的所有普通闰年与世纪闰年。时间复杂度 < O(n)
第一种方法,易读性方面更好。
第二种方法,时间复杂度更小。
代码实现:
一、遍历所有年份
#include <stdio.h>
#define MAX_YEAR 3000
#define MIN_YEAR 1000
int main()
{
int i = 0;
//遍历1000~3000中的所有年份
for (i = MIN_YEAR; i <= MAX_YEAR; i++)
{
//将2个条件放入判断语句中
//符合的即为闰年
if (((i % 4 == 0) && (i % 100 != 0)) || i % 400 == 0)
{
printf("%d ", i);
}
}
return 0;
}
二、直接遍历所有闰年
#include <stdio.h>
#define MAX_YEAR 3000
#define MIN_YEAR 1000
int main()
{
int i = 0;
//直接遍历所有闰年
for (i = MIN_YEAR; i <= MAX_YEAR; i += 4)
{
//剔除公历年份是整百数的,但不是400倍数的年份
//这种属于4的倍数,但整百数年中,还必须满足400倍数的条件
//所以它不是闰年
if (i % 100 == 0 && i % 400 != 0)
{
continue;
}
printf("%d ", i);
}
return 0;
}