Palindrome Numbers(LA2889)第n个回文数是?
J - Palindrome Numbers
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
#include<stdio.h> #define LL long long #define MM 2000000000 LL num[25]= {0}; LL ppow(LL x,LL y) { LL tp=1; while(y--) { tp*=x; } return tp; } void init() { LL tp=9,i; for(i=1;;) { num[i]=num[i-1]+tp; i++;//同行有多个i要处理的时候i,不要把i++放里面,由于变异环境不同。运算顺序不同,可能会wa num[i]=num[i-1]+tp; i++; tp=tp*10; if(num[i-1]>=MM)break; } /* for(int i=1;i<21;i++) { LL p=(i+1)/2-1; num[i]=num[i-1]+9*ppow(10,p); // printf("%lld\n",num[i]); } // printf("%lld\n",num[0]);*/ } int main() { init(); LL n; LL a[20]; while(scanf("%lld",&n),n) { int len=0; for(int i=1; i<=20; i++) { if(n<=num[i]) { len=i; break; } } // printf("len=%d\n",len); LL m=n-num[len-1]; int l=(len+1)/2; // printf("m=%lld\tl=%d\n",m,l); LL ans=ppow(10,l-1)+m-1; // printf("ans=%lld\tppow=%lld\n",ans,ppow(10,l-1)); printf("%lld",ans); if(len&1) ans/=10; while(ans) { printf("%lld",ans%10); ans/=10; } printf("\n"); } return 0; }