题目链接:回文日期
思路
总的来说就是给你一个日期,去找它下一个最近的回文日期和ABABBABA型的回文日期。
要做的准备:
-
判断+1天后,该日期是否出现0~9之外的东东
-
判断+1天后,年份属于平年或闰年
-
判断日期每部分数字是否合法
即:
月份:1~12
日:(1,3,5,7,8,10,12月)有31天 ,(4,6,9,11月)有30天,2月(平年28天)(闰年29天) -
找回文串
**注意点: 11111111这种纯A型的也属于ABABBABA型的,坑点!!!!!!o( ̄ヘ ̄o#)
代码(原谅我只会暴力):
为了练习字符处理,我抛弃了简单的整型处理!!!w(゚Д゚)w
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
char a[10];
int yh,yab,flag;
bool pan_r(int y)//判断是否为闰年
{
if(y%4==0&&y%100!=0||y%400==0)
return true;
else
return false;
}
void xiu()//修改+1天后的日期,保证日期均为0~9的数字字符
{
for(int i=7;i>0;i--)
{
if(a[i]==':')
{
a[i]='0';
a[i-1]+=1;
}
}
}
void pan_ymd()//+1天后判断年月日是否还合法,不合法修改
{
xiu();
int y,m,d;
y=(a[0]-'0')*1000+(a[1]-'0')*100+(a[2]-'0')*10+a[3]-'0'; //年
m=(a[4]-'0')*10+a[5]-'0'; //月
d=(a[6]-'0')*10+a[7]-'0'; //日
if(m!=2) //进行非二月份的日期合法判断
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d==32) //最多31天
{
a[6]='0';
a[7]='1';
a[5]+=1;
m+=1;
}
}
else if(m==4||m==6||m==9||m==11)
{
if(d==31) //最多30天
{
a[6]='0';
a[7]='1';
a[5]+=1;
}
}
//非法日期,月份不可能超过12
if(m>12)
{
a[4]='0';
a[5]='1';
y+=1;
int i=3;
while(y)
{
a[i--]='0'+y%10;
y/=10;
}
}
}
else
{
if(pan_r(y))
{
if(d==30) //闰年二月最多29天
{
a[6]='0';
a[7]='1';
a[5]+=1;
}
}
else
{
if(d==29) //平年二月最多28天
{
a[6]='0';
a[7]='1';
a[5]+=1;
}
}
}
}
void pan_hw()//进行回文串的判断,筛选出第一个回文串和第一个ABABBABA型的回文串
{
int i,j,x=0,y=0,s;
for(i=0;i<8;i++)
x=x*10+(a[i]-'0');
s=x;
while(s)
{
y=y*10+s%10;
s/=10;
}
if(x==y)
{
if(!flag)
{
yh=x; //找到第一个回文串
flag=1;
}
if(a[0]==a[2]&&a[0]==a[5]&&a[0]==a[7]&&a[1]==a[3]&&a[1]==a[4]&&a[1]==a[6])
{
flag=2;
yab=x; //找到第一个ABABBABA型的回文串
}
}
}
int main()
{
int i,j;
scanf("%s",a);
while(flag!=2)
{
a[7]+=1; //加一天
pan_ymd();
pan_hw();
if(flag==2) //两个回文串都找到
printf("%d\n%d",yh,yab);
}
return 0;
}