蓝桥杯真题:回文日期

蓝桥杯真题:回文日期_第1张图片

 蓝桥杯真题:回文日期_第2张图片

 

输入输出样例

示例

输入

20200202

输出

20211202
21211212

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

分析:首先题目给出了范围(不过<=99999999好像才能过),我们想要求后边的回文,可以暴力求解。我们有两个任务,第一个是求下一个回文,第二个是求下一个ABABBABA的回文。

如果是暴力方法,由于题目中已经给出范围,我们可以遍历从输入后一位之后的全部的8位数,然后当然不是所有的位数都满足年月日的范围的,我们需要检查,这是一个功能,可以抽象成一个函数。

除此之外,如何判断一个数是否是回文?我们可以用栈的思想,把这个数字反过来和原来相等的话就是的。不过这里的做法是很朴素的,就是抽取年月日,把年倒过来和当前数i%10000(即i的后四位的数)比较,看是否相等,这也是一个功能,抽取出来就是倒置一个数。

具体代码如下所示:

#include 
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int y,int m,int d)
{
  //这里前面两个条件必要吗
  if(d<=0 || m<=0 || m>=13) return false;
  if(m!=2)
  {
    if(d>months[m]) return false;
  }
  else
  {
    int day=months[2]+ (y%4==0&&y%100!=0||y%400==0);
    if(d>day) return false;
  }
  return true;
}

int flip(int y)
{
  int res=0;
  while(y)
  {
    res=res*10+y%10;
    y/=10;
  }
  return res;
}

int main()
{
  int n;
  cin>>n;
  bool str1=false,str2=false;
  int ans1,ans2;
  for(int i=n+1;i<=99999999;++i)
  {
    int year=i/10000,month=i%10000/100,day=i%100;
    if(check(year,month,day))
    {
      if(i%10000==flip(year) && !str1)
      {
        ans1=i;
        str1=true;
      }
      if(i%10000==flip(year) && !str2 && (month/10==day/10) && (month%10==day%10))
      {
        ans2=i;
        str2=true;
      }
    }
    if(str1 && str2)
    {
      break;
    }
  }
  cout<

如果我们直接用字符串操作或许可以这样,不过在此基础上应该还要加个范围判断:

#include
#include
#include
using namespace std;

string n, t;

int main() {
    cin >> n;
    string a = "0", b = "0";//输出答案的变量
    int flag = 1;
    while (a == "0" || b == "0")
    {
        int i = 7;
        int rdw = (n[i] - '0') + 1;
        if (rdw > 9) {
            while (rdw > 9)
            {
                n[i] = '0';
                n[i - 1] ++;
                i--;
                rdw = (n[i] - '0');
            }//循环进位
        }
        else
        {
            n[i]++;
        }
        t = n; reverse(t.begin(), t.end());//反转字符串
        if (t == n) {
            if (flag) {
                a = t; flag = 0;//第一次遇到回文
            }
            char a1 = t[0], b1 = t[1];
            if (a1 == t[2] && b1 == t[3] && b1 == t[4] && a1 == t[5] && b1 == t[6] && a1 == t[7]) {
                b = t;
            }//ababbaba型
        }
    }
    cout << a << endl << b;
    return 0;
}

你可能感兴趣的:(蓝桥杯,p2p,职场和发展)