原题:
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日)一共有多少个星期日落在了当月的第一天?
解题思路:
这道题目如果直接从算法的角度思考,确实比较麻烦,不过也不算难,只是需要做好几个条件判断,我大概说一下思路:
非闰年一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】,
这道题可以从第一个月开始对七求余,将余数累积到下个月的天数上,直到这个月(包括起始的那个月)的天数满足是7的倍数,
那么就得到了一个解,依次循环遍历20世纪所有的月就可以得到答案。
但是既然这道题是用灵活的java写的,而java中关于日期的判断有一个非常强大和丰富的类叫做 "Calendar"中文意思就是日历,
如果你想了解关于这个类的更多信息,请自行谷歌。这个类中有个子类叫做GregorianCalendar,它的get方法可以在知晓
年,月,日的情况下反还整数类型[0-6],分别对应着周日到周一。
有了这样一个简单好用的东东,我怎么可能放着不用呢?,如下是java的代码:
public class Launcher {
public static void main(String[] args){
int sunday_num=0;
for(int i=1901;i<2001;i++){
for(int j=1;j<13;j++){
if(is_sunday(i,j)){
sunday_num++;
}
}
}
System.out.println(sunday_num);
}
public static boolean is_sunday(int year,int month)
{
boolean day;
GregorianCalendar gc=new GregorianCalendar();
gc.set(year,month-1,1);
day=gc.get(Calendar.DAY_OF_WEEK)-1==0?true:false;
return day;
}
}