黑色星期五

【问题描述 】

黑色星期五源于西方的宗教信仰与迷信:耶稣基督死在星期五,而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类的用法

 

posted @ 2015-03-27 08:36  #码农#  阅读(1354)  评论(0编辑  收藏  举报