题目请参考***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
先说思路:
①第七位第八位是月份,且这两位对称,也就只有11号和22号符合要求。
②而第五第六是月份,第九第十位是几点,这四位应该对称,符合要求的有:01月与10点,02月与20点,
10月与01点,11月与11点,12月与21点。
综合①②,也就是一年10种情况
③前四位与后四位分别是年份与分秒,此处的限制条件是分和秒小于60,也就是年份的百位和个位最大为5
下面是我写的代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main() {
int n,i;
char a[20],b[20];
int k,j=-1;
scanf("%d",&k);
for(i=2020;; i++) {
memset(a,0,sizeof(a));
sprintf(a,"%d",i);
if(a[1]<'6'&&a[3]<'6')
j+=10;
if(j>=k)
break;
}
int x=k%10;
if(x == 9) {
memset(a,0,sizeof(a));
sprintf(a,"%d",i+1);
printf("%d011110",i+1);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x == 0) {
printf("%d012210",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x == 1) {
printf("%d021120",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x == 2) {
printf("%d022220",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if( x == 3 ) {
printf("%d101101",i);
for( int o=3; o >= 0; o--)
printf("%c",a[o]);
}
else if( x == 4 ) {
printf("%d102201",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x == 5) {
printf("%d111111",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x == 6) {
printf("%d112211",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x == 7) {
printf("%d121121",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
else if(x==8) {
printf("%d122221",i);
for(int o=3; o>=0; o--)
printf("%c",a[o]);
}
return 0;
}