Section 1.1 Friday the Thirteenth

本文介绍了一个程序,该程序不使用内置日期函数来计算从1900年开始到给定年份范围内每年1月1日为星期五的次数,并区分是否为闰年。通过两个过程leapyear和unleapyear分别处理闰年和平年的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题设有两个要求:

Do not use any built-in date functions in your computer language.

Don't just precompute the answers, either, please. 

没理解,不管怎么样算是练基本功吧打了好长个程序。

procedure leapyear用于计算当前年是闰年。

procedure unleapyear用于计算当前年非闰年。

start表示当前年Jan. 1st是星期几。

注意一个小细节就是输出顺序:Saturday, Sunday, Monday, Tuesday, ..., Friday.

Friday
const day1:array[1..12] of integer=(31,29,31,30,31,30,31,31,30,31,30,31);
      day2:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
var a:array[1..7] of longint;
    n,k,start,i:integer;
procedure leapyear(s:integer);
var i:integer;
begin
  s:=(s+12-1) mod 7+1;
  inc(a[s]);
  for i:=1 to 11 do
    begin
      s:=(s+day1[i]-1) mod 7+1;
      inc(a[s]);
    end;
end;

procedure unleapyear(s:integer);
var i:integer;
begin
  s:=(s+12-1) mod 7+1;
  inc(a[s]);
  for i:=1 to 11 do
    begin
      s:=(s+day2[i]-1) mod 7+1;
      inc(a[s]);
    end;
end;

begin
  assign(input,'friday.in');reset(input);
  assign(output,'friday.out');rewrite(output);
  readln(n);
  k:=0;
  start:=1;
  while k<n do
    begin
      if ((k mod 4=0) and (k mod 100<>0)) or ((k+1900) mod 400=0) then
        begin
          leapyear(start);
          start:=(start+366-1) mod 7+1;
        end
      else
        begin
          unleapyear(start);
          start:=(start+365-1) mod 7+1;
        end;
      inc(k);
    end;
  writeln(a[6],' ',a[7],' ',a[1],' ',a[2],' ',a[3],' ',a[4],' ',a[5]);
  close(input);close(output);
end.

 

转载于:https://www.cnblogs.com/Sky-Grey/archive/2012/12/14/2818829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值