lllllllll


私信TA

用户名:wangli6686

访问量:1926

签 名:

等  级
排  名 2498
经  验 2278
参赛次数 6
文章发表 5
年  龄 0
在职情况 学生
学  校 河北农业大学
专  业

  自我简介:

解题思路:


首先保证回文,回文的格式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 人评分

  评论区

  • «
  • »