zoukankan      html  css  js  c++  java
  • 洛谷 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) {;}
    代码
  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7526757.html
Copyright © 2011-2022 走看看