1. 程式人生 > >洛谷 U3348 A2-回文數

洛谷 U3348 A2-回文數

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-回文數