原题地址906. 超级回文数
如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。
现在,给定两个正整数 L
和 R
(以字符串形式表示),返回包含在范围 [L, R]
中的超级回文数的数目。
示例:
输入:L = "4", R = "1000"
输出:4
解释:
4,9,121,以及 484 是超级回文数。
注意 676 不是一个超级回文数: 26 * 26 = 676,但是 26 不是回文数。
提示:
1 <= len(L) <= 18
1 <= len(R) <= 18
L
和R
是表示[1, 10^18)
范围的整数的字符串。int(L) <= int(R)
算法
判断在 和 区间中的回文数的乘方是否回文数。若逐个遍历会超时,手动构造区间中的回文数,可以大大减少计算量。
代码
def fun(L, R):
"""
:type L: str
:type R: str
:rtype: int
"""
def ishw(a):
s = str(a)
mi = len(s)
for i in range(int(mi / 2)):
if s[i] != s[mi - i - 1]:
return False
return True
import cmath
ls = cmath.sqrt(int(L)).real
ls = int(ls) + 1 if ls % 1 > 0 else int(ls)
rs = int(cmath.sqrt(int(R)).real)
ans = 0
s = str(ls)
flag = 1 if len(s) % 2 else 0
mid = len(s) // 2 + 1 if flag else len(s) // 2
tmp = int(s[:mid])
num = ls
while num <= rs:
tmp1 = str(tmp)
if len(tmp1) > mid:
if flag == 0:
mid += 1
else:
tmp1 = tmp1[:-1]
tmp //= 10
flag = 1 - flag
tmp2 = tmp1[:-1] if flag else tmp1
num = int(tmp1 + tmp2[::-1])
if ls <= num <= rs and ishw(num * num):
ans += 1
tmp += 1
return ans