• 洛谷 U3348 A2-回文数


    题目背景

    方方方很喜欢回文数,于是就有了一道关于回文数的题目。

    题目描述

    求从小到大第n(1<=n<=10^18)个回文数。

    注释:出题人认为回文数不包括0。

    输入输出格式

    输入格式:

    一行一个正整数n。

    输出格式:

    第n个回文数。

    输入输出样例

    输入样例#1:
    2333
    输出样例#1:
    1334331
    输入样例#2:
    12345678987654321
    输出样例#2:
    23456789876543222234567898765432

    说明

    对于50%的数据,n<=3000。

    对于100%的数据,1<=n<=10^18。..

    输出第n个回文数 

    光是规律我就找了好长时间 

    首先一位数的回文数有9个 (1,2,3,.....9)     两位数的回文数有9个 

    三位数的回文数有90个    四位数的回文数有90个

    五位数的回文数有900个    六位数的回文数有900个   

    七位数的回文数有9000个    七位数的回文数有9000个 

    。。。。。。。。。

    以上打个表就找出规律来了  

    输出第n个回文数 首先要找出位数  

    偶数位的回文数  第一位数字减1 最后一位数字加1  再对称到另一边(见样例二)

    奇数位的回文数  第一位数字减1 最后一位数字加1  再以最后一位数字为对称中心 将其他数字对称到另一边去

    注意 加1 满10时要进位 (代码丑 不喜勿喷)

     1 #include <cstdio>
     2 #include <cctype>
     3 #include <cstdlib>
     4 
     5 typedef long long LL;
     6 
     7 LL n,len;
     8 
     9 int pos;
    10 
    11 int ans[50];
    12 
    13 bool flag;
    14 
    15 inline void read(LL&x) {
    16     int f=1;register char c=getchar();
    17     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
    18     for(;isdigit(c);x=x*10+c-48,c=getchar());
    19     x=x*f;
    20 }
    21 
    22 inline bool check() {
    23     LL k=1;
    24     for(int i=1;;++i) {
    25         if(len-9*k<0) {pos=i;break;} 
    26         len-=9*k;
    27         if((i-1)&1) k*=10;
    28     }
    29     if(!len) pos--;
    30     if(pos&1) return false;
    31     else return true;
    32 }
    33 
    34 inline void print() {
    35     int p=pos/2;
    36     len=n;
    37     if(!flag) p=pos/2+1;
    38     ans[p--]=len%10+1;
    39     len/=10;
    40     while(p) {
    41         int q=len%10;
    42         len/=10;
    43         ans[p--]=q;
    44     }
    45     if(!flag) p=pos/2+1;
    46     else p=pos/2;
    47     for(int i=p;i>=1;--i) 
    48       ans[i-1]+=ans[i]/10,ans[i]%=10;
    49     p=pos;
    50     for(int i=1;i<=pos/2;++i) ans[p--]=ans[i];
    51     if(!flag) {if(!ans[1]) ans[1]=ans[pos]=10;ans[1]=ans[pos]=ans[1]-1;}
    52     return;
    53 }
    54 
    55 int hh() {
    56 //    freopen("hwc.in","r",stdin);
    57 //    freopen("hwc.out","w",stdout);
    58     read(n);
    59     len=n;
    60     flag=check();
    61     if(!len) for(int i=1;i<=pos;++i) printf("9");
    62     else if(len==1) {
    63         ans[1]=ans[pos]=1;
    64         for(int i=1;i<=pos;++i) printf("%d",ans[i]);
    65     }
    66     else {
    67         print();
    68         for(int i=1;i<=pos;++i) printf("%d",ans[i]);
    69     }
    70     printf("
    ");
    71     return 0;
    72 }
    73 
    74 int sb=hh();
    75 int main(int argc,char**argv) {;}
    代码
  • 相关阅读:
    flask强大的第三方组件之falsk-sqlalchemy
    flask 外键关系和多对多查询
    flask sqlalchemy 单表查询
    functools模块
    面试题
    ansible git
    python 操作 表格
    matplotlib
    node,npm,webpack,vue-cli模块化编程安装流程
    Webpack
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7526757.html
Copyright © 2020-2023  润新知