题目:
求出大于或等于 N
的最小回文素数。
回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。
例如,2,3,5,7,11 以及 13 是素数。
回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。
例如,12321 是回文数
思路:
1.对于大于N的数进行是否是质数和回文数的判断,超时,网上查阅发现偶数位的回文数除了11都不是质数
2.对于给定的数,自己制造回文数,而后对其是否是质数进行判断,减少用时
1.
def isPalindrome(self, x: int) -> bool:
s = str(x)
return s == s[::-1]
def isPrime(self,n):
if n < 2:
return False
for i in range(2,int(n**0.5)+1):
if n % i == 0:
return False
return True
def primePalindrome(self, N: int) -> int:
while (not self.isPalindrome(N)) or (not self.isPrime(N)) :
if N > 11 and len(str(N)) % 2 == 0:
N = 10**len(str(N))+1
else:
N +=1
return N
2.将给定的数字按照长度拆成一半,另一半由其回文组成
def isPrime(self,n):
if n < 2:
return False
for i in range(2,int(n**0.5)+1):
if n % i == 0:
return False
return True
def getNext(self,n):
s = str(n)
m = len(s) % 2 #判断奇数位还是偶数位
l = s[:len(s) // 2 + m] #奇数位则多取一位用于制作镜像
r = int(l + l[::-1][m:])
if r > n:#制作的回文可能会比原有数字小,则需要对其镜像加一重新制作,直到比原有数字大为止
return r
if set(l) == {'9'}:#遇到进位会使镜像过长,需要让其变短
m += 1
l = str(int(l) + 1)
r = int(l + l[::-1][m:])
return r
def primePalindrome(self, N: int) -> int:
s = str(N)
if s != s[::-1]:
N = self.next(N)
while not self.isPrime(N) :
N = self.getNext(N)
return N