在Python中检查回文三角形正方形

时间:2018-11-08 16:52:13

标签: python-3.x math

nm = 0
def infinity(start=0):
    n = start
    while True:
        yield n
        n += 1
while nm in infinity(1):
    nT = nm*(nm+1)/2
    nS = nm**2
    nR = int(str(nm)[::-1])
    if nT==nS==nR:
        N = nT
        print(N)
    nm = nm+1

我一直在尝试编写一个程序来检查从0到无穷大的每个数字是否满足3个要求。这些应同时为回文,三角形和正方形。我很难弄清楚如何修复代码的数学部分。

2 个答案:

答案 0 :(得分:0)

您的代码中的问题是整体逻辑。您查看每个正整数,试图确定它是三角形,正方形还是回文。

但是,您并没有真正检查nm是三角形还是正方形。您实际上是在计算第nm个三角数和第nm个平方数。除了第一个01之外,它们永远不会彼此相等,也不会等于nm,因此您的测试将失败。相反,您应该检查nm是否为三角数,以及nm是否为平方数。对于非常大的nm,这些测试更加困难,因此我建议采用另一种方法。

您的回文检查也失败。您正确地找到了nm的反向数字,但是应该对照nm进行检查。相反,您可以根据第nm个三角形和正方形的数字对其进行检查。

所有这些问题都可以得到解决,但是您的程序将极端变慢。 This Wikipedia page显示前12个正方形的数字。最后一位有16位数字。除了前两个01外,没有一个是回文。回文率可能更高,但是您的程序几乎要永久地找到它们。

我建议使用其他方法。使用更快的方法来遍历正方形三角形,避免使用其他所有数字。维基百科页面提供了几种方法。然后检查每个回文是否是回文。 Python可以处理更大的数字,尽管计算会变慢,所以您实际上可能会找到回文。

这是一种简单的方法,可以仅遍历方形三角数字,而忽略琐碎的01

nold = 0
n = 1
for nm in infinity(2):
    nold, n = n, 34 * n - nold + 2
    # check if n is a palindrome

当然,这是一个无限循环。请注意,nm从未真正使用过,但它是方形三角形数字n的索引。该计算来自第一个循环关系here。一种解释涉及Pell方程的解,该解通常使用连续分数。让我知道您是否真的需要更多信息,尽管Wikipedia文章确实对此进行了解释。

答案 1 :(得分:0)

very simple recurrence用于生成平方三角数。因此,您可以只生成这些数字,而不会浪费时间检查所有自然数。

您唯一需要做的-检查数字是否为palindrom

def SqTr():
    a, b = 0, 1
    for i in range(10):
        a, b = 2 + 34 * a - b, a
        print(a)

SqTr()