方方方很喜歡回文數,於是就有了一道關於回文數的題目。
求從小到大第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,末位-1,然後進行對稱變換
細節有三個:
1.如果前兩項為10,需要把1減去,0變成9
2.如果末項為9,加1之後向前進製
3.對稱變換需要考慮對稱軸是最後一位數還是最後一位數後面的位置,這就需要提前預處理輸出結果一共有幾位數
*/#include
#include
#include
using
namespace
std;
long
long sum[60],a[60
];long
long
n;int bin[1000],len,b[1000
];long
long pow(int
mi)int
main()
cin>>n;
int pos=lower_bound(sum+1,sum+38,n)-sum;//
pos就是數的位數
if(n==sum[pos-1])pos--;
//cout(n)
for(int i=1,j=len;i<=len;i++,j--)bin[i]=b[j];
bin[
1]--;bin[len]++;
if(bin[1]==0&&bin[2]==0)bin[2]=9
;
int now=len;
while(bin[now]>=10
)
int l=len,r=len+1
;
if(pos%2==1)l--;
while(l>=1
) l=1,r--;
while(bin[l]==0)l++;
while(bin[r]==0)r--;
for(int i=l;i<=r;i++)printf("%d"
,bin[i]);
}
洛谷P1015回文數
若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數56,將56加65 即把5656從右向左讀 得到121是乙個回文數。又如 對於十進位制數8787 step1 87 78 165 step2 165 561 726 step3 726 627 135...
洛谷 P1015 回文數
題目描述 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數5656,將5656加6565 即把5656從右向左讀 得到121121是乙個回文數。又如 對於十進位制數8787 step1 8787 7878 165165 step2 165165 5...
洛谷P1015(回文數
若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數 56,將 56 加 65 即把 5656 從右向左讀 得到 121 是乙個回文數。又如 對於十進位制數 87 step1 87 78 165 step2 165 561 726 step3 726 ...