算法:计算某年的第一天是星期几

首先,利用你的公式编一简单程序:
main()
  { int year;/*年份*/

    intw;   /*星期几*/

    scanf("%d",&year);

    w=((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+1)%7;

    printf("%d\n",w);

    getch();

  }

运行时,输入1,得到结果1。即,如果这个公式正确,公元1年的第一天是星期一。这是一个计算前提,必须先搞清楚。

然后要知道闰年的规定:凡是年份能够被4整除、且不能被100整除的是闰年;凡是年份能被400整除的也是闰年;除此以外的年份都不是闰年。

第三要知道闰年366天、平年365天。

公元1年第一天(下文简称"起始天")之后,要计算某天是星期几,只要用“这天与起始天之差”,与7求余,当余数为0,则这天与起始天星期几相同,也是星期一;否则,这个余数+1就是这天的星期几。

    假设这个程序时输入年份year,则该年的第一天距离起始天的差是:

  (year-1)*365+(公元1年到公元year-1年内的闰年个数(每个闰年多一天啊!))  。。。(1)

公元1年到公元year-1年内的闰年个数的计算:

根据闰年规定,反过来考虑可以知道:大致每4年有1个闰年,这样算得到: 公元1年到公元year-1年内的闰年个数=(year-1)/4,但每一百年要扣掉1个闰年,修正一下得到:

      公元1年到公元year-1年内的闰年个数=(year-1)/4-(year/100)

扣多了!每400年又要增加一个闰年,再次修正得到:

      公元1年到公元year-1年内的闰年个数=(year-1)/4-(year/100)+(year/400)

代入(1)得到年份year第一天距离起始天的差是:

      (year-1)*365+(year-1)/4-(year/100)+(year/400)

这天是星期几?前面说过,是这个差与7求余+1:

      [(year-1)*365+(year-1)/4-(year/100)+(year/400)]%7+1

这个末尾的1可以放到被除数里面,即:

      [(year-1)*365+(year-1)/4-(year/100)+(year/400)+1]%7

     =[(year-1)*(364+1)+(year-1)/4-(year/100)+(year/400)+1]%7

     =[(year-1)*364+(year-1)+(year-1)/4-(year/100)+(year/400)+1]%7

364是7的倍数,year*364也一定是7的倍数,所以year*364可以去掉,这就得到了

最后的计算式:

     =[(year-1)+(year-1)/4-(year/100)+(year/400)+1]%7

这个[ ]内最后的1,可以看成是新年的第1天。更一般地,year年度的第D天是星期几?可以用下式计算:

[(year-1)+(year-1)/4-(year/100)+(year/400)+D]%7


  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值