求出大於或等於 n 的最小回文素數。
回顧一下,如果乙個數大於 1,且其因數只有 1 和它自身,那麼這個數是素數。
例如,2,3,5,7,11 以及 13 是素數。
回顧一下,如果乙個數從左往右讀與從右往左讀是一樣的,那麼這個數是回文數。
例如,12321 是回文數。
示例 1:
輸入:6
輸出:7
示例 2:
輸入:8
輸出:11
示例 3:
輸入:13
輸出:101
回文數:乙個數在反轉得到的數值後與原來的數值相等,則該數為回文數。
演算法判斷:判斷回文數的方法大概可以分為兩種。
一、可以將該數轉換為字串,設定指標分別指向首尾,若兩指標指向的值相等是,兩指標往中間移動,也就是首指標往後移動,尾指標往前移動。如果出現兩個值不等,則表示該數不是回文數,結束迴圈,做出判斷;當首指標的位置大於尾指標的位置時跳出迴圈,此時可以判斷出該數為回文數。
二、直接使用該數進行判斷,先儲存該數,然後將該數拆開來重組,大概的做法就是每次將存放重組後的數乘10再加上該數取餘,然後該數再除去10,如此迴圈操作,當該數為0時跳出迴圈,最後比較原來的數和存放重組後的數,如果相等,則表示要判斷的數為回文數,反之則不是。
素數:乙個數除了1和自身外沒有其他因數的數,稱為素數。
演算法判斷:大致做法就是將要判斷的數除去從2到自身的數之前之間的所有數,利用迴圈可以很簡單的實現。在此基礎上可以進行優化,具體優化後面展示和分析。
對於這道題的做法,相信很多人的第一想法都會是直接暴力破解:從輸入的數開始,先判斷該數是否是回文數,再進行判斷該數是否是素數,如果都不是,則該數自加1,再進入判斷,如此迴圈,直到找到。
這個想法,對於該題來說,基本的思想是對的,不過如果沒有進行細節的優化,在提交的時候會發現在輸入是(n=9989900)時,時間超限了,這是因為該數不是回文素數,而從該數到下個回文素數之間的間距很大,導致要進行很多次的判斷,而素數的判斷和回文數的判斷在大規模資料判斷時,耗時會非常大,所以導致了時間超限。
優化:首先可以對素數的判斷上進行優化,常見的優化就是將迴圈到自身停止的條件改為迴圈到自身開根後乙個數停止,這樣一來時間複雜度會從o(n
)o(n)
o(n)
降低到o(n
)o(\sqrt)
o(n
),這樣一來素數的判斷速度會提公升很多,但是在做完這樣的優化後還是會在9989900這個部分超時。在這之後,觀摩領扣上大佬們的做法後,尋找更加高效的素數判斷,找到了一種6步進素數判別法,具體的證明和做法尋找於:素數的四種判斷方法、實現及比較。但是在做完該優化後,還是存在時間超限的現象,所以對於素數判斷的優化上還不夠,領扣上的大佬們還在回文數上進行了優化。回文數的優化大概如下:通過觀察回文數,發現除了11外,其他偶數長度的回文數,如22,33,1111,1221,111111…之類的都不是素數,所以可以在迴圈中跳過偶數長度的數。具體內容學習於領扣上一位大佬的題解:**優化的荊棘之路。經過這一步優化後,時間超限的情況就不會出現了。
bool
isprime
(int n)
for(
int i =
5; i <=
sqrt
(n); i+=6
)}return
true;}
intprimepalindrome
(int n)
;//小於等於11的數直接進行判斷,用陣列存放起0到11之間每個數對應能夠得到的回文素數
if(n <12)
return ret[n];if
((n &1)
==0)//如果該數為偶數,則該數必然不是素數,則將該數自加變為奇數,這裡用位運算會比較快
++n;
for(
int i = n;
; i +=2
)//每次步數為2,跳過了偶數if(
isprime
(i))
//如果該數是素數,則進行回文數的判斷
int j;
for (j = 0; j < len >> 1; ++j)//回文數判斷
}if (j == len >> 1)//如果不是break跳出迴圈的,則該數為回文數
*///這一部分是字串判斷回文數的做法
int rev =
0,m = i;
//這一部分是反轉該數進行回文數判斷的做法,rev存放反轉後的數
int len =0;
//用於存放該數的長度
for(
;m;)
//獲取反轉後的數
if(rev == i)
//反轉後的數與原值相等,則該數為回文數
return i;if(
(len &1)
==0)}
}}
對我來說,通過這道題和觀摩大佬們的**,我真的學到了很多,這道題領扣上的大佬們還有更加高效的做法,就是通過字串構造回文數,然後轉換為整型,再判斷構造後的數是否為素數以及是否比原值大,如果都滿足,則所構造的回文數為回文素數,具體做法可以到領扣上觀摩,csdn上也有此類的做法。 回文素數(Prime Palindrome)
時間限制 1 sec 記憶體限制 128 mb 如果乙個數從左邊讀和從右邊讀都是同乙個數,就稱為回文數,既是素數又是回文數的數,稱為回文素數。找出某個範圍內的回文素數。整數m和n,2 m n範圍內的所有回文素數,從小大到排列,每行10個數。5 5005 7 11 101 131 151 181 19...
c 回文素數
題目描述 如果乙個數從左邊讀和從右邊讀都是同乙個數,就稱為回文數。例如6886就是乙個回文數,從給出的資料中統計出既是回文數又是素數的數的個數 109 輸入一行,包含若干個正整數,以 1結束。輸出一行,包行乙個正整數,表示回文素數的個數。如無則輸出0 樣例輸入 7 12 10 11 121 1331...
python123回文素數 平方回文素數
問題描述 素數的平方是回文,比如11 11 121。求不超過1000的平方回文素數。我的 import math def prime m count 0 for i in range 2,int math.sqrt m 1 if m i 0 count 1 if count 1 return tru...