总和少于30的回文,有助于优化我的代码

时间:2016-09-11 16:22:43

标签: python optimization

在我学习Python的过程中,我对问题进行了研究:

我必须计算从 0 130000 的所有数字,这些都是回文,但它们应该是数字和它的反转版本之和后的回文。例如:
i = 93
93 + 39 = 132
132 + 231 = 363 在{b> 1 或更多次求和之后,count_of_palindromes应计算所有i个回文数,但小于 50
我已经编写了代码但是在我的电脑上运行太难了,Python停止响应:(

有关如何优化代码的建议吗?

        count_of_palindromes = 0
        for i in range(0,130000):
            trying = 0
            if (i == int(str(i)[::-1])) != True:
                trying += 1
                sum = i + int(str(i)[::-1])
                while trying <= 50:
                    while (sum == int(str(sum)[::-1])) != True:
                        trying += 1
                        sum += int(str(sum)[::-1])                
                    if trying > 0 and trying <= 50:
                        count_of_palindromes += 1
                        break
        print(count_of_palindromes)

非常感谢!

3 个答案:

答案 0 :(得分:0)

此解决方案有很多转换,因此它可能不是最佳解决方案,但无论它是一个解决方案。看看这篇文章他有一个看似更好的方法来逆转整数而不转换 https://stackoverflow.com/a/3806212/1642546

如果您合并我的代码和发布代码。你可能会有一个更快的解决方案,但你必须对它进行基准测试才能看到。

token = 0
for x in range(130000):
   reversed = str(x)[::-1]
   original = str(x)
   sum = int(reversed) + int(original)
   if str(sum) == str(sum)[::-1]:
      token+=1
print(token)

答案 1 :(得分:0)

我在代码中出错,这使程序几乎无限:)
正确的代码(我认为如下)

count_of_palindromes = 0
for i in range(12814):
    if (i == int(str(i)[::-1])) != True:
        trying = 1
        sum = i + int(str(i)[::-1])
        while trying <= 50:
            while (sum == int(str(sum)[::-1])) != True and trying <=50:
                trying += 1
                sum += int(str(sum)[::-1])                
            if trying > 0 and trying <= 50:
                count_of_palindromes += 1
                break
print(count_of_palindromes)

答案 2 :(得分:0)

为了便于阅读,请先将代码整理一下。我们只需要使用一些语法重字符串并封装它。

def reverse(n):
    return int(str(n)[::-1])

def is_palindrome(n):
    return n == reverse(n)

那更好。我认为你的问题是第二个嵌套的while循环。它一直运行直到找到回文,然后检查它是否在前五十次尝试中找到它。你希望它运行多达五十次,然后放弃。我认为最好的方法是第二次循环

count_of_palindromes = 0
for i in range(130000):
    for tries in range(50):
        if(is_palindrome(i)):
            counter += 1
            break
        else:
            i = i + reverse(i)
print(count_of_palindromes)

还有一些方法可以通过避免字符串操作并用数学替换它们来加快速度,但这样做太过分了。我有点不清楚你的问题是如何要求你治疗天然回文,所以你可能需要修改这个解决方案