洛谷 U3348 A2-回文數
阿新 • • 發佈:2017-09-15
col num 回文數 輸入輸出格式 ret .org ans blank 一半
題目背景
方方方很喜歡回文數,於是就有了一道關於回文數的題目。
題目描述
求從小到大第n(1<=n<=10^18)個回文數。
註釋:出題人認為回文數不包括0。
輸入輸出格式
輸入格式:
一行一個正整數n。
輸出格式:
第n個回文數。
輸入輸出樣例
輸入樣例#1:2333輸出樣例#1:
1334331輸入樣例#2:
12345678987654321輸出樣例#2:
23456789876543222234567898765432
說明
對於50%的數據,n<=3000。
對於100%的數據,1<=n<=10^18。..
打表找規律
1 2 3 4 5 6位的回文個數分別是 9 9 90 90 900 900...
規律很明顯了。
一個回文數 123456654321 左右是一樣的
所以只求一半就可以了 然後拼接起來
屠龍寶刀點擊就送
#include <cstring> #include <cstdio> typedef long long LL; struct node { int a[50],len; node() { memset(a,0,sizeof(a));len=0; } }Ret,RetS; node findhws(LL n) { LL ret,cnt=0,w=0,num=9,half=1; for(;1;) { if(w>0&&w%2==0) num*=10; w++; if(cnt+num>=n) break; cnt+=num; } n=n-cnt-1; for(int i=1;i<=w-1>>1;++i) half*=10;//趙基數 half+=n; ret=half; if(w%2==1) half/=10; for(;ret;ret/=10) Ret.a[++Ret.len]=ret%10; RetS=Ret; for(int i=1;i<=RetS.len;++i) Ret.a[RetS.len-i+1]=RetS.a[i]; for(;half;half/=10) Ret.a[++Ret.len]=half%10; return Ret; } LL n,len; int main() { scanf("%lld",&n); node ans=findhws(n); for(int i=1;i<=ans.len;++i) printf("%d",ans.a[i]); return 0; }
洛谷 U3348 A2-回文數