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个要求。这些应同时为回文,三角形和正方形。我很难弄清楚如何修复代码的数学部分。
答案 0 :(得分:0)
您的代码中的问题是整体逻辑。您查看每个正整数,试图确定它是三角形,正方形还是回文。
但是,您并没有真正检查nm
是三角形还是正方形。您实际上是在计算第nm
个三角数和第nm
个平方数。除了第一个0
和1
之外,它们永远不会彼此相等,也不会等于nm
,因此您的测试将失败。相反,您应该检查nm
是否为三角数,以及nm
是否为平方数。对于非常大的nm
,这些测试更加困难,因此我建议采用另一种方法。
您的回文检查也失败。您正确地找到了nm
的反向数字,但是应该对照nm
进行检查。相反,您可以根据第nm
个三角形和正方形的数字对其进行检查。
所有这些问题都可以得到解决,但是您的程序将极端变慢。 This Wikipedia page显示前12个正方形的数字。最后一位有16位数字。除了前两个0
和1
外,没有一个是回文。回文率可能更高,但是您的程序几乎要永久地找到它们。
我建议使用其他方法。使用更快的方法来遍历正方形三角形,避免使用其他所有数字。维基百科页面提供了几种方法。然后检查每个回文是否是回文。 Python可以处理更大的数字,尽管计算会变慢,所以您实际上可能会找到回文。
这是一种简单的方法,可以仅遍历方形三角数字,而忽略琐碎的0
和1
。
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()