• 洛谷 P1609 最小回文数 题解


    这题其实并不难,重点在你对回文数的了解,根本就不需要高精度。

    打个比方:

    对于一个形如 ABCDEFGH 的整数

    有且仅有一个比它大的最小回文数

    有且仅有一个比它小的最大回文数

    而整数 ABCDDCBA 一定是其中之一

    ~

    如:99299是比99200大的最小回文数

    10101 是比 10201 小的最大回文数

    所以可以得出结论

    ~

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

    ~

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

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

    注意:B=9时要进位,对于9999一类的数要特判!!!

    ~

    原理:一个回文数是根据它前半部分来的,所以它的下一个回文数就是原回文数的最中间的一个(或两个)数加1得来的。(不懂的要好好想一想)

    下面是代码:

    #include<bits/stdc++.h>
    using namespace std;
    int l,i,f;  char s[201],k[201];
    int main(){
        scanf("%s",s);
        l=strlen(s)-1;//下面是特判
        while(s[i++]=='9')if(i==l+1)for(s[0]='1',l++;i>0;i--)s[i]='0';
        for(i=0;i<=l-i;i++)k[i]=k[l-i]=s[i];
        if(strcmp(k,s)<=0){//小于原数的话中间要加1!
            while(k[--i]=='9');k[i]=k[l-i]=++k[i];
            for(i++;i<=l-i;i++)k[i]=k[l-i]='0';
        }cout<<k;
        return 0;
    }
    //对于特判的解释:
    //像9999可以直接转换成10000来算。
    

    最短代码,不接受质疑。

    如有不懂可以私信我,如代码有漏洞请各位大佬及时指出,谢谢!

    ✐☎博主撰文不易,转载还请注明出处;若对本文有疑,请私信或在下方讨论中提出。O(∩_∩)O谢谢!☏

    ☃〔尽管小伙伴们肯定有千百种方式针对,但博主还是极其非常十分不要脸的把反对键吃掉辣!〕☃

    ✿『$At$ $last$:非常一(hu)本(shuo)正(ba)经(dao)的:博主很笨,请不要欺负他』✿✍

  • 相关阅读:
    Eclipse:构造函数不提示才发现
    Java:终于找到了在alloy中的JFileChooser中的弹出式菜单不显示文字的解决办法
    java:给图片上加水印
    Asp:函数是用传值还是传址
    数据库移植注意事项
    51nod 1009 数字1的数量
    51nod1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    2017 Multi-University Training Contest
    HDU 3251 Being a Hero 最小割
  • 原文地址:https://www.cnblogs.com/812-xiao-wen/p/9879208.html
Copyright © 2020-2023  润新知