NOIP2016普及组第二题——回文日期

SSL 2592
洛谷 P2010 回文日期
题目描述
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月份,最后2位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。
一个8位数字是回文的,当且仅当对于所有的i(1 <=i<=8)从左向右数的第i个数字和第9-i个数字(即从右向左数的第i个数字)是相同的。

const
  a:array[1..12]of longint=(31,28,31,30,31,30,31,31,30,31,30,31);
var
  s1,s2,s,m,d,i,j,k,ys,ye,ms,me,ds,de:longint;
begin
  readln(s1);
  readln(s2);
  ys:=s1 div 10000;
  ye:=s2 div 10000;
  ms:=(s1 mod 10000)div 100;
  me:=(s2 mod 10000)div 100;
  ds:=s1 mod 100;
  de:=s2 mod 100;
  for i:=ys to ye do
   begin
     a[2]:=28;
     if (i mod 4=0)and(i mod 100<>0)or(i mod 100=0)and(i mod 400=0) then
      a[2]:=29;
     for j:=1 to 12 do
      if (i=ys)and(j>=ms)or(i=ye)and(j<=me)or(1=1) then
       begin
         if j<10 then m:=j*10
          else m:=(j mod 10*10)+(j div 10);
         for k:=1 to a[j] do
          if (i=ys)and(j=ms)and(k>=ds)or(i=ye)and(j=me)and(k<=de)or(1=1) then
           begin
             if k<10 then d:=k*10
              else d:=(k mod 10*10)+(k div 10);
             if i=d*100+m then begin inc(s);break; end;
           end;
         if i=d*100+m then break;
       end;
   end;
  writeln(s);
end.

题解:直接暴力搜索。i是年份变化,j是月份变化,k是日期变化。
每次年份变化时,判断平闰年;
每次月份变化时,调用前面已经设定好的天数,进入日期变化;
进入日期变化以后,直接判断,是不是回文的。

这就是NOIP2016普及组第二题的题解。(好没有营养。。)

你可能感兴趣的:(NOIP2016普及组第二题——回文日期)