# 工学1号馆

home

## Project Euler 19–Counting Sundays

Wu Yudong    January 16, 2017     欧拉计划   568

You are given the following information, but you may prefer to do some research for yourself.

• 1 Jan 1900 was a Monday.
• Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
• A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

• 1900年1月1日是星期一。
• 30天的月份有：9月，4月，6月，11月。
• 此外的月份都是31天，当然2月除外。
• 2月在闰年有29天，其他时候有28天。
• 年份可以被4整除的时候是闰年，但是不能被400整除的世纪年（100的整数倍年）除外。

20世纪（1901年1月1日到2000年12月31日）一共有多少个星期日落在了当月的第一天？

#include <stdio.h>
#include <stdbool.h>

const int a[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

bool leapYear(int n)			//判断闰年
{
return (((n % 4 == 0) && (n % 100 != 0)) || (n % 400 == 0));
}

bool issunday(int n)			//判断某天是否是星期天
{
return (n % 7 == 0 ? true : false);
}

void solve(void)
{
int num, i, j, count;
count = 0;

i = 1901;
num = 1;
while (i < 2000) {

int t = (leapYear(i) ? 1 : 0);	//判断闰年
for (j = 0; j < 12; j++) {
num += a[t][j];
if (issunday(num))
count++;
}
i++;
}
printf("%d\n", count);
}

int main(void)
{
solve();
return 0;
}