回文数:回文数即正反读都是相同的数,如151、12321等,注意,个位数与0也是回文数。
例题:
回文时间(题目链接https://acm.ecnu.edu.cn/contest/247/problem/A/)
Cuber QQ 很惊奇地发现 2020 年 1 月 22的 10:02:02 构成的字符串竟然是一个回文串。(构成的字符串是 20200122100202 ),这下又有充足的理由约女神吃饭了。
可是这之后,女神开始为难 Cuber QQ 了。她现在只允许 Cuber QQ 在回文时间约她吃饭。
回文时间指的是,年份(四位数字构成)+月份(两位数字构成)+日期(两位数字构成)+小时(两位数字构成)+分钟(两位数字构成)+秒(两位数字构成)所形成的字符串是一个回文字符串。其中时间的表示形式是 24 小时制,例如下午 01:02 表示为 13:02 。
于是 Cuber QQ 开始期待之后的约会了。他现在想知道 2020 年 1 月 22 日的 10:02:02 之后第 k 个回文时间是多少(特别地,之后第 0 个回文时间就是 20200122100202 )。
保证他们约会的时间不可能晚于 9999 年 12 月 31 日的 23:59:59 。
输入格式
输入数据包含一行一个整数 k ,表示要求的是之后的第 k 个回文时间。
保证对于给定的输入,输出的答案不会大于 99991231235959 ,即晚于 9999 年 12 月 31 日的 23:59:59 。
输出格式
输出一行一个字符串表示答案。
样例
input
0
output
20200122100202
input
2
output
20200222200202
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int month[6] = {0,1,2,10,11,12};
int date[3] = {0,11,22};
struct ans
{
int year;
int month;
int date;
int hour;
int minute;
int second;
}f[30000];
int main()
{
int k;
cin >> k;
int t=1;
for(int i = 2020; i <= 9999; i ++)
{
int a = i;
int b = a % 100;
int minute = (b%10) * 10 + (b/10);
if(minute >= 0 && minute <= 59)
{
int c = a / 100;
int second = (c%10) * 10 + (c/10);
if(second >= 0 && second <= 59)
{
for(int p = 1;p <= 5;p ++)
{
for(int w = 1;w <= 2;w ++)
{
f[t].year = a;
f[t].month = month[p];
f[t].date = date[w];
f[t].hour = f[t].month/10 + (f[t].month%10) * 10;
f[t].minute = minute;
f[t].second = second;
t ++;
}
}
}
}
}
printf("%d%02d%02d%02d%02d%02d\n",f[k+2].year,f[k+2].month,f[k+2].date,f[k+2].hour,f[k+2].minute,f[k+2].second);
return 0;
}