洛谷 U3348 A2-回文数
Posted 心之所向 素履以往
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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("\n"); 71 return 0; 72 } 73 74 int sb=hh(); 75 int main(int argc,char**argv) {;}
以上是关于洛谷 U3348 A2-回文数的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes