備忘。
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...