黑色星期五
【问题描述 】
黑色星期五源于西方的宗教信仰与迷信:耶稣基督死在星期五,而13是不吉利的数 字。两者的结合令人相信当天会发生不幸的事情。星期五和数字13都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的13日又恰逢星期五就叫“黑色星期五”。找出未来儿年哪些天是“黑色星期五”。
【问题分析 】
这个问题是一个很经典的“穷举+逻辑判断”的题目。通过问题描述,我们知道“黑色星期五” 要满足两个条件,一是当天是13号,二是当天还是星期五。我们可以从起始日期开始,循环判断每天是否同时满足这两个条件就可以了。这个方案很容易想到,但是一年三百多天,一天天判断是不是太慢了,有人也许会说,计算机速度快,很快就能处理完。有没有更好的办法呢,当然有了,其实条件说的很明白啊,条件之一必须满足是13号,那么我们就判断13号是不是星期五不就可以了吗,一年日期是13号的,也就12个月里,每个月一个13日,这样我们判断的日期也就缩小到每个月的13号,一年最多判断12次,比较范围大大缩小。每个月的13号到底是星期几呢?Java中的日期处理类Calendar提供的方法能够很容易地获得。
(1)确定程序框架
通过前面的分析,一年内有几个"黑色星期五",要分别判断每个月的13号是不是星期五,可以通过循环语句循环12次来实现。如果要找到未来n年内的黑色星期五,外层再用循环语句控制循环n次,这样我们就可以写出程序框架了。代码如下:
while(k<n) //k为循环变量,n代表未来年份
{
for (int i = 0; i < 12; i++)
{
if(当前月的13号是星期五)
{
System.out.println("黑色星期五:"+当前日期);
}
}
year++; //year代表起始年份
k++;
}
下面我们就需要考虑如何判断每个月13号是星期几。
(2)判断13号是星期几
每个月的13号到底是星期几呢?可以通过Java中的日期处理类Calendar提供的方法来获得。使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成,最后根据Calendar类对象信息来获得星期几。对应代码如下:
//创建一个代表2012年1月13日的Calendar对象
Calendar cal = Calendar.getInstance(); //创建对象
cal.set(2012, 1, 13); //日期的设置
cal.get(Calendar.DAY_OF_WEEK)-1 //星期的获得
cal.getTime() //日期的获得
我们要判断每个月的13号是不是星期五,所以只要把日期的设置方法set()第二个月份参数用循环变量来代替即可。同理,如果要对其他年份进行设置,也只要把第一个年份参数替换掉即可。
【程序代码】
1 import java.text.SimpleDateFormat; 2 import java.util.Calendar; 3 import java.util.GregorianCalendar; 4 import java.util.Scanner; 5 6 public class ch2_1 7 { 8 public static void main(String[] args) 9 { 10 // TODO Auto-generated method stub 11 Scanner input=new Scanner(System.in); //获取控制台输入对象 12 System.out.print("请输入起始年份:"); 13 int year=input.nextInt(); //从键盘接收起始年份 14 System.out.print("请输入打算输出未来几年:"); 15 int n=input.nextInt(); //从键盘接收打算输出年份 16 getBlackFri(year,n); //调用得到“黑色星期五”方法 17 18 } 19 20 //打印未来几年的黑色星期五,判断每个月的13号是否是星期五 21 public static void getBlackFri(int year,int n) 22 { 23 //year为输入的年份,n为未来多少年 24 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E"); //日期格式对象 25 int k=0; 26 Calendar cal = Calendar.getInstance(); //获得日历对象 27 while(k<n) //外循环控制年份 28 { 29 for (int i = 0; i < 12; i++) //内循环控制月份 30 { 31 cal.set(year, i,13); //设置日期 32 if(5==(cal.get(Calendar.DAY_OF_WEEK)-1)) //判断是否是星期五 33 { 34 System.out.println("黑色星期五:"+sdf.format(cal.getTime())); //输出格式化日期 35 } 36 } 37 year++; //年份增加 38 k++; 39 } 40 } 41 }
【运行结果】
【相关知识】
Calendar类的用法