今天看到一个很有趣的题目,题目描述如下:
根据下列信息计算在1901年1月1日至2000年12月31日间共有多少个星期天落在每月的第一天上?
a) 1900.1.1是星期一
b) 1月,3月,5月,7月,8月,10月和12月是31天
c) 4月,6月,9月和11月是30天
d) 2月是28天,在闰年是29天
e) 公元年数能被4整除且又不能被100整除是闰年
f) 能直接被400整除也是闰年
以下是C语言实现版本:
#include <stdio.h>
#include <stdbool.h>
bool isLeapYear(int year);
// start is the weekday of 1st, January
// return the num of the first day of each month
// is Sunday.
// the start will change into the next year
int getYearNum(int* start, int year);
// Num of days of each month
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int leapdays[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(void)
{
int sum = 0;
int start = 1901;
int end = 2000;
int startWeek = 1;
int startYear = 1900;
int i;
for (i = 1; i < 13; ++i)
days[i] += days[i - 1];
for (i = 1; i < 13; ++i)
leapdays[i] += leapdays[i - 1];
for (i = startYear; i < start; ++i)
getYearNum(&startWeek, i);
for (i = start; i <= end; ++i)
sum += getYearNum(&startWeek, i);
printf("%d\n", sum);
return 0;
}
bool isLeapYear(int year)
{
if (year % 4 == 0 && year % 100 != 0)
return true;
else if (year % 400 == 0)
return true;
return false;
}
int getYearNum(int* start, int year)
{
int i;
int count = 0;
int yeardays;
if (isLea