求第N個回文數 模板

2022-03-03 19:38:23 字數 942 閱讀 3550

備忘。

1

/*看到n可以取到2*10^9.說明普通方法乙個個暴力計算肯定會超時的,那打表呢?打表我們要先寫個打表的**,這裡不提供。打完表觀察資料,我們會發現資料其實是有規律的。完全不需要暴力的把所有資料打出來了!

2通過資料我們發現,第n個回文數的規律如下:

31位的回文數有9個

42位的回文數有9個

53位的回文數有90個

64位的回文數有90個

75位的回文數有900個

86位的回文數有900個

9原因是什麼呢,如四位數的回文數個數,我們只看字串的一半,從1001到9999,只看一半就是共有90個回文數。

10通過這樣的規律,我們知道,只要數字增加2位,相應的該數字回文數就會是上位的10倍。

11編碼過程就是,先算出這個回文數有幾位,然後算該位數下最小的回文數與該回文數的距離(回文數以一半為基準算)

12時間複雜度幾乎為o(1),而之前的迴圈判斷回文數並記數的方法明顯快。

*/13 #include14 #include15

using

namespace

std;

16 typedef long

long

ll;17

ll findhw(ll index)

25 index=index-cnt-1;26

for(int i=0;i<(w-1)/2;i++)

27 half*=10

;28 half+=index;

29 res=half;

30if(w%2==1)half/=10;31

while

(half)

35return

res;36}

37int

main()

早就忘了當時寫這個是幹嘛了。

回文數 第N個回文數

判斷回文數還是不難,如果能轉為字串就更簡單了。如果是求第n個回文數呢。12321是乙個回文數,這裡先考慮一半的情況。回文數的個數其實是有規律的。如 1位回文數 9個 2位回文數 9個 3位回文數 90個 4位回文數 90個 5位回文數 900個 6位回文數 900個 我們看到9 90 900,是不是...

求第N個醜數

原問題描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。這個題不是很難,基本上看完題就能想出解法,但是要想出時間複雜度為o n 的解法還是有點難度的。我最開始的解法時...

UVALive 2889 第n個回文數字

include define ll long long define ull unsigned long long define all x x begin x end using namespace std 求第n個回文數字,n 2e9 ll sum 22 a 22 ll fac 22 int m...