NOIP2016 第二题 回文日期

题目:

NOIP2016 第二题 回文日期_第1张图片

题解:

我们可以先做出60%,这很简单:只要判断回文;
后40%判断日期。

代码:

var date1,date2,i,j,k,ans,t,y1,y2,m1,m2,d1,d2,xm,xd,ym,yd:longint;
    a,y:array[0..13] of integer;
procedure main(dt:longint);
var t:boolean;
    i:longint;
begin
  i:=0;
  while dt>0 do
    begin
      inc(i);
      a[i]:=dt mod 10;
      dt:=dt div 10;
    end;
    t:=true;
    for i:=1 to 4 do
      if a[i]<>a[9-i] then t:=false;
      if t=true then inc(ans);
end;
begin
  read(date1);
  read(date2);
  ans:=0;
  if date1=date2 then
  begin
    main(date1);
    write(ans);
  end else
  begin
    y1:=date1 div 10000; m1:=date1 div 100-y1*100; d1:=date1 mod 100;
    y2:=date2 div 10000; m2:=date2 div 100-y2*100; d2:=date2 mod 100;
    y[1]:=31; y[3]:=31; y[4]:=30; y[5]:=31; y[6]:=30;
    y[7]:=31; y[8]:=31; y[9]:=30; y[10]:=31; y[11]:=30; y[12]:=31;
    for i:=y1 to y2 do
    begin
      if (i mod 4=0)and(i mod 100<>0)or(i mod 4=0)and(i mod 400=0) then
      y[2]:=29 else y[2]:=28;
      if (i=y1)and(y1=y2) then begin xm:=m1;ym:=m2; end else
      if i=y1 then begin xm:=m1; ym:=12; end else
      if i=y2 then begin ym:=m2; xm:=1; end else
      begin xm:=1; ym:=12; end;
      for j:=xm to ym do
      begin
        if (i=y1)and(y1=y2)and(j=m1)and(m1=m2) then
        begin xd:=d1;yd:=d2; end else
        if (i=y1)and(j=m1) then begin xd:=d1; yd:=y[j]; end else
        if (i=y2)and(j=m2) then begin yd:=d2; xd:=1; end else
        begin xd:=1; yd:=y[j]; end;
        for k:=xd to yd do
        begin
          t:=i*10000+j*100+k;
          main(t);
        end;
      end;
    end;
    write(ans);
  end;
end.














你可能感兴趣的:(题解,NOIP)