注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ice1020502的博客

春天来了,冬天还会远吗?

 
 
 

日志

 
 

13日是星期五的概率是最高的  

2009-09-10 17:40:33|  分类: 数学问题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

【转自】Matrix67

   你是否还记得,今年的4月13日是黑色星期五。短短三个月后,黑色星期五再次现身!为什么这一天老是出现呢?

    恐怕心理原因是最好的解释。人们对黑色星期五的出现记忆更深刻,给人一种黑色星期五常常出现的错觉。有趣的是,仔细算一算,你会发现13日是星期五的次数真的要多一些。

    很多人以为现在实行的历法是4年一循环,这是不对的。现在实行的历法以400年为一个循环。大家很容易忽略整百年的问题。一个很有意思的智力题就是问一个人是否可能连续5年不过生日。有个笑话说文科MM感叹她等了她男友4年,整整1460天,学理科的好友脱口而出“难道你男友是1900年的”。我们可以算一下在这400年中共有多少天:365*303+366*97=146097。这个数正好能被7整除。换句话说,现在与400年后的星期数不变,日历完全相同。在这400年里一共有4800个月,利用Zeller公式可以编程统计出13日是星期几的次数最多,这对于OIer们再熟悉不过了,因为USACO有一道题就是干这种无聊的事情。下面就是程序运行后的结果:

  • Sunday     687

  • Monday     685

  • Tuesday    685

  • Wednesday  687

  • Thursday   684

  • Friday     688

  • Saturday   684

    可以看到,事实上13日是星期五的概率确实是最高的。

    另外,注意到了么,利用“400年一周期”这个结论我们可以对USACO的那个题进行扩展,出一个Friday the Thirteenth数据加强版。

附:Zeller公式

【转自】http://blog.csdn.net/MasterLuo/archive/2008/09/29/2997668.aspx

蔡勒(Zeller)公式:

w=((y+[y/4]+[c/4]-2c+[26(m+1)/10+d-1)%7+7)%7    w=0,1,2,......6(星期日,星期一,星期二...星期六)

公式中含义如下:

w:星期  y:年(两位数)  c:世纪  m:月份(如果是1,2月,要当作上年的第13,14月,当然,世纪与年份也得相应修改)  d:日期

zeller公式只适应于求1582年10月15日之后的情形:

下面程序用于求星期(程序不检测输入数据的正确性):

//author:MasterLuo

#include <iostream>
       using namespace std;

int year, month, day;

int main()
{
    const char week[7][12]={ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"};
    while(true)
    {
        int choice, y, m, d, cc, yy, w;
        printf("please input you choice:\n1:input year, month, day.and the days after 1582-10-15\n2:exit\n");
        scanf("%d", &choice);
        switch(choice)
        {
        case 1:
            scanf("%d%d%d", &year, &month, &day);
            y=year, m=month, d=day;
            if(month<3)
            {
                month=12+month;
                year--;
            }
            cc=year/100;
            yy=year%100;
            w=((yy+int(yy/4)+int(cc/4)-2*cc+int(26*(month+1)/10)+day-1)%7+7)%7;
            printf("%d %d %d is %s\n", y, m, d, week[w]);
            break;
        case 2:
            return 0;
            break;
        default:
            printf("input error!\n");
            break;
        }
    }
    return 0;
}

  评论这张
 
阅读(116)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018