• 最小回文数


    题目描述

    回文数是从左向右读和从右向左读结果一样的数字串。

    例如:121、44 和3是回文数,175和36不是。

    对于一个给定的N,请你寻找一个回文数P,满足P>N。

    满足这样条件的回文数很多,你的任务是输出其中最小的一个。

    输入格式

    1行,一个正整数N。N的数值小于10^100,并且N没有前导0。

    输出格式

    你的程序应该输出一行,最小的回文数P(P>N)。

    输入输出样例

    输入 #1
    44
    输出 #1
    55

    说明/提示

    50%的数据,N<10^9

    100%的数据,N<10^100

    输入一个整数 ABCD ,若整数ABBA 比 ABCD 大,则 ABBA 就是比它大的最小回文数,然后就可以直接输出这个答案了。

    而如果 ABBA 比 ABCD 要小(或等于)那我们就要找到比 ABBA 大的下一个回文数。

    不难发现它就是:ACCA 且 C=B+1。

    #include<cstdio>
    #include<cstring> 
    using namespace std;
    
    char a[1002];
    
    int b[1002],s[1002],t[1002];
    
    int l,mid1,ls=0;
    
    void add(){
        int i,x,y;
        i=mid1+1;
        x=b[i]+1;
        b[i]=x%10;
        y=i;
        if(l%2==0){
            b[i-1]=b[i];
            y=i-1;
        }
        while(x>9){
            i++;
            x=b[i]+1;
            b[i]=x%10;
            y--;
            x=b[y]+1;
            b[y]=x%10;
        }   
    }
    
    void hw(){
        int top=0,j,next;
        for(j=0;j<=mid1;j++){
            s[++top]=b[j];
        }
        if(l%2==0){
            next=mid1+1;
        }
        else{
            next=mid1+2;
        }
        for(j=next;j<l;j++){
            t[top]=b[j];
            ls++;
            top--;
        }
        for(j=0;j<=mid1;j++){
            b[j]=t[++top];
        }
    }
    
    int com(){
        int i;
        for(i=ls;i;i--){
            if(s[i]<t[i])
                return 0;
            else{
                if(s[i]>t[i]){ 
                    return 1;
                }
            }
        }
        return 1;
    }
    
    int main(){
        int i,p;
        scanf("%s",a);
        l=strlen(a);
        for(i=0;i<l;i++){     
            b[i]=a[l-i-1]-'0';
        }
        for(p=0;p<l;p++){
            if(b[p]!=9){
                break;
            }
        }
        if(p==l){
            printf("1");
            for(i=0;i<l-1;i++){
                printf("0");
            }
            printf("1");
            return 0;
        }
        mid1=l/2-1;
        hw();
        if(com()){
            add();
        }
        for(i=l-1;i>=0;i--){
            printf("%d",b[i]);
        }
        return 0;
    }
  • 相关阅读:
    《机电传动控制》学习笔记08-1
    《机电传动控制》学习笔记-07
    《机电传动控制》学习笔记-06
    《机电传动控制》学习笔记05-2
    《机电传动控制》学习笔记05-1
    《团队项目》日志一
    《实时控制软件》第四周作业
    《实时控制软件》第三周作业
    《实时控制软件》第二周作业
    《机电传动控制》PLC仿真
  • 原文地址:https://www.cnblogs.com/hrj1/p/11186114.html
Copyright © 2020-2023  润新知