解题思路:
首先保证回文,回文的格式ABCDDCBA是比较简单的方式就是对四位数字放在前四位,反转的数放在后四位,就可以实现回文;
特殊回文:ABABBABA,可以理解为有一个两位数,放在最高两位和次高两位,反转之后的数,需要放在次低和最低两位。
由此可见,需要一个反转函数。此外光反转是不够的,还需要查看日期是否在所给日期之后,并且月日是否在相应的范围内,所以由此诞生一个数组,用于装每个月天数。
到这就又产生了一个问题,就是对于闰年和平年的2月份天数不一致。把它列出来看一看:闰年:02.29,那么对应的年份就是9220,是符合要求的,同理02.28也一样,所以无需考虑闰年还是平年问题,我们只需要在2月对应的天数内写上29,判断天数是否小于这个值即可。
注意事项:
对于两个for循环i的最大值考虑:我们需要对有限制条件的月日进行考虑,比如ab月cd日,反转之后位dcba,我们要秉持dcba最大原则,那么d=9,由此容易看出对应的c=2,同理b=9,a=0;第二个for循环一样的思路,当然也可以设置成最大的四位数和最大的两位数,由于有check
函数存在,也不会打印错误的结果
参考代码:
#include using namespace std; int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int n; int reverse(int x){ int n1=0; while(x){ int m=x%10; n1=n1*10+m; x=x/10; } return n1; } int check(int x){ if(x<=n) return 0; int d=x%100; x=x/100; int m=x%100; if(m>=1&&m<=12&&(d<=a[m])){ return 1; } return 0; } int main(){ cin>>n; for(int i=n/10000;i<=9290;i++){ int x=i*10000+reverse(i); if(check(x)==1){ cout<<x<<endl; break; } } for(int i=n/1000000;i<=92;i++){ int x=i*1000000+i*10000+reverse(i)*100+reverse(i); if(check(x)==1){ cout<<x; break; } } return 0; }
0.0分
7 人评分
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1019 |
简单的a+b (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:672 |
printf基础练习2 (C语言代码)浏览:955 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:940 |
打水问题 (C语言代码)浏览:1148 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:1090 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:573 |
【简单计算】 (C语言代码)浏览:642 |
母牛的故事 (C语言代码)浏览:1451 |