Counting Sundays
Problem 19
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日是星期一,所以1900年的最后一天算出来也是星期二,即对7余1;然后直接算就行了。
#include <iostream>
#include <map>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int cmp(int n)
{
if(n%4==0&&n%100!=0||n%400==0) return 1;
return 0;
}
int main()
{
int sum=0,i,j,b=1;
for(i=1901; i<=2000; i++)
{
if(cmp(i)) a[1]=29;
else a[1]=28; //a数组是全局变量,所以要归源
for(j=0; j<12; j++)
{
b=(b+a[j])%7;
if(b==5) sum++; //如果每个月加上上个月余下的对7取模余5的话,意思就是这个月的最后一天是星期六,那么下个月的第一天当然就是星期天啦
}
}
cout<<sum<<endl;
return 0;
}