DianNier  
  1. 输入格式
    输入包含一个八位整数 N,表示日期。
    对于所有评测用例,10000101<=N<=89991231,保证N是一个合法日期的 8 位数表示。
  2. 输出格式
    输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
  3. 题解
    (1)判断是否为回文数(即正着读倒着读都一样,镜像对称),需要对称位上的数字相同,我们就要把每个数位上的数字剥离出来,赋给a,b,c,d,e,f,g,h;
    (2)我们在判断回文数的时候要判断是否为合法日期,这就需要我们把日期中的年,月,日分割开来,赋给year,month,day;在判断month是否合法时还涉及到闰年问题,则我们还要自定义函数来判断year是否为闰年。
    (3)本代码用户输入的日期范围可以到99999999.
    (4)由于题目要求只要求输入一个回文数和一个ABABBABA型回文数。则我们设置标志变量flag,来表示是否已经输出过一个回文日期,若已经输出,flag=false;由于回文数不一定为ABABBABA型回文数,而ABABBABA型回文数定时回文数,则若满足是ABABBABA型回文数则前面一定已经输出了回文数,直接break退出循环即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;

bool isLeap(int year)
{
  if((year%4==0&&year%100!=0)||(year%400)) return true;
  return false;
}

bool cheak(int year,int month,int day)
{
  if(month>12||month<1) return false;
  if(day>31) return false;
  if(month==2)
  {
    if(isLeap(year))
    {
      if(day>29) return false;
    }
    else
    {
      if(day>28) return false;
    }
  }
  if(month==4||month==6||month==9||month==11) 
  {
    if(day>30) return false;
  }
  return true;
}

int main()
{
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  int r;cin>>r;//r代表输入的八位日期
  int a,b,c,d,e,f,g,h;//分别代表日期的八位数
  int year,month,day;

  bool flag=false;
  for(int i=r+1;i<=99999999;i++)
  {
    a=i%10;//a表示日期的最后一位数
    b=(i/10)%10;
    c=(i/100)%10;
    d=(i/1000)%10;
    e=(i/10000)%10;
    f=(i/100000)%10;
    g=(i/1000000)%10;
    h=(i/10000000)%10;
    year=i/10000;
    month=(i%10000)/100;
    day=i%100;

    if(a==h&&b==g&&c==f&&e==d&&flag==false)
    {
      if(cheak(year,month,day))
      {
        cout<<i<<'\n';
        flag=true;//代表已经输出一个回文了
      }
    }
    
    if(a==h&&b==g&&c==f&&e==d&&a==c&&b==d)
    {
      if(cheak(year,month,day))
      {
        cout<<i<<'\n';
        break;//退出for循环
      }
    }
  }
  return 0;
}
posted on 2024-03-04 10:30  芭娜娜banana  阅读(39)  评论(0)    收藏  举报