首页 > 解决方案 > pi、euler、黄金比例等常数的金字塔形表示

问题描述

我在互联网上找不到它,但一个常量的 piramidial 表示如下:

在第 i 层有 n 行,从上到下编号(i = 1, 2, ... , n)是第 i 个数字,每个数字是常数中接下来 i 个数字的总和.

具有 5 行的 pi 的 piramidial 表示示例

我们得到常数和行数作为输入,然后我们需要这个金字塔作为输出。我知道我必须使用 2 个 for 循环,但我对如何使用它们感到非常困惑。

cte = input()
verdiep = int(input())
for i in range(1, verdiep+1):
    pyramid = 0
    rij = ''
    for sum in range(i, len(cte)):
        if cte[i] != '.':
            pyramid += int(cte[i])
            rij += str(pyramid)
    print(rij)

到目前为止,这是我的代码,我知道我不应该在我的第二个 for 循环中使用 in range(i, len(cte)) 但我不知道如何在不使用 3 个 for 循环的情况下执行此操作,因为那时我认为我的程序只是崩溃,因为它需要太长时间。如何获取常量的索引?

标签: pythonmath

解决方案


我对这些金字塔的第一个观察是,在每一步,它都会从给定序列中提取 step^2 数量的符号。

在您在上面分享的 pix 中,金字塔级别 ^2(从顶部开始,从 1 开始)来自 pi 的数字。

我们可以如下编程

b = 31415926535897936 # assume we have such number
step = 1
stop = 3 # pyramid level - from top
start = 0

while step <= stop:
    end = start + step**2
    c = str(b)
    row = c[start:end]
    row_blocks = [{'numbers': [i for i in xs], 'sum': sum(int(i) for i in xs)} for xs in in_groups(row, step)]
    print(row_blocks)
    start = end
    step += 1

输出结果,例如,

[{'numbers': ['3'], 'sum': 3}]
[{'numbers': ['1', '4'], 'sum': 5}, {'numbers': ['1', '5'], 'sum': 6}]
[{'numbers': ['9', '2', '6'], 'sum': 17}, {'numbers': ['5', '3', '5'], 'sum': 13}, {'numbers': ['8', '9', '7'], 'sum': 24}]

ps

in_groups是一个辅助方法,它的行为是这样的

>>> [i for i in in_groups('1234567890', 3)]
['123', '456', '789', '0']
>>> [i for i in in_groups('1234567890', 2)]
['12', '34', '56', '78', '90']

功能体

def in_groups(iterable, size):
    for i in range(0,len(iterable), size):
        yield iterable[i: i+size]

我确定 itertools 有替代方案,但现在无法记住。


推荐阅读