Jam*_*pam 3 python algorithm palindrome data-structures
是否有任何关于从给定的int求解下一个更高的素数和回文数的建议.
这是我正在尝试的片段,但它有点慢,请建议如果你有任何好的算法,我可以测试.
#!/usr/bin/python
def next_higher(n):
while True:
s = str(n)
if not any([n % i == 0 \
for i in range(2, int(n**0.5))]) and s == s[::-1]:
return n
n = n + 1
print next_higher(2004)
print next_higher(20)
Run Code Online (Sandbox Code Playgroud)
输出:
10201
101
Run Code Online (Sandbox Code Playgroud)
在质数之前更新了回文的代码测试.比我以前的代码快得多.我正在实施user2357112的建议.
#!/usr/bin/python
def next_higher(n):
while True:
s = str(n)
if s == s[::-1]:
if not any([n % i == 0 \
for i in range(2, int(n**0.5))]):
return n
n = n + 1
print next_higher(2004111)
print next_higher(2004)
print next_higher(2004)
print next_higher(20)
Run Code Online (Sandbox Code Playgroud)
你可以做很多优化:
[2] + range(3, int(n**0.5) + 1, 2)只检查2之后的奇数.(你也需要像我在评论中提到的那样做sqrt + 1) )()而不是[].[]首先生成整个因子列表,然后才检查any.如果使用(),它会创建一个生成器,因此只要True找到值就会停止,而不会计算整个列表.xrange而不是range出于同样的原因(xrange给出一个生成器,range给出一个列表)+ 1每次都做.除了最后两个之外,这是一个包含大多数优化的版本:
def next_higher(n):
if n % 2 == 0:
n = n - 1
while True:
n = n + 2
s = str(n)
if s == s[::-1]:
if not any((n % i == 0 for i in xrange(3, int(n**0.5) + 1, 2))):
return n
Run Code Online (Sandbox Code Playgroud)
我相信这应该是相当快的.但是如果你愿意,你可以进行最后2次优化,使其更快.
| 归档时间: |
|
| 查看次数: |
1558 次 |
| 最近记录: |