工学1号馆

home

Project Euler 19–Counting Sundays

Wu Yudong    January 16, 2017     欧拉计划   535   

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;
}

Answer:171

Completed on Mon, 18 Nov 2013, 11:38

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)