python - 计算菱形图案中星星的数量

标签 python python-3.x counting

我正在开发一个用 Python 打印菱形图案的程序。

下面是我的代码:

a=int(input("Enter the minimum number of stars:"))
b=int(input("Enter the maximum number of stars:"))

rows=(b-a+1)
for i in range(rows):
    print(' '*(rows-i-1)+'* '*(i+a))
for j in range(rows-2,-1,-1):
    print(' '*(rows-j-1)+'* '*(j+a))

下面是执行代码的输出截图:

screenshot

我需要打印图案中的星星总数。但是,count() 在这种情况下不起作用。

您能为此建议一种替代方法吗?

最佳答案

首先,您的代码已经计算出在每个 for 循环中需要打印多少颗星:

for i in range(rows):
    print(' '*(rows-i-1)+'* '*(i+a))
    #                          ^^^  number of stars on this line
for j in range(rows-2,-1,-1):
    print(' '*(rows-j-1)+'* '*(j+a))
    #                          ^^^  number of stars on this line

因此您可以在打印时将这些数字相加。

但是您真的不需要计算或求和任何东西,您可以计算

您正在构建三角形,因此您可以使用 triangle number formula计算进入三角形的星星数量。对于由 n 行组成的三角形,所需的星数为:

n x (n + 1)
-----------
    2

每次将最小星数 a 设置为 1 时,您就会得到两个完整的三角形:一个有 b 行,一个有 b - 1 行;例如对于示例图像,其中 b 设置为 5,顶部三角形中有 5 行:

1.     *
2.    * *
3.   * * *
4.  * * * *
5. * * * * *

底部还有 4 个:

4.  * * * *
3.   * * *
2.    * *
1.     *

a 大于 1 时,您基本上留下了两个较小的三角形,高度均为 a - 1。假设 a = 3,您遗漏了第一行和最后两行:

1.     .       # not printed
2.    . .      # not printed
3.   * * *
4.  * * * *
5. * * * * *
4.  * * * *
3.   * * *
2.    . .      # not printed
1.     .       # not printed

所以你可以计算出需要的星星数 b 的三角形数,加上 b - 1 的三角形数,减去 a 的三角形数- 1,两次。

这是进行计算的代码:

def triangle_number(n):
    return n * (n + 1) // 2

total_stars = triangle_number(b) + triangle_number(b - 1) - (2 * triangle_number(a - 1))

对于图像中的示例,a = 1b = 5,上面计算了 5 行三角形中的星星数 (b ),在一个有 4 行的三角形中(b - 1,倒三角形),并减去如果 a 更大则必须删除的星星大于 1(所以这里是 0):

>>> a = 1
>>> b = 5
>>> triangle_number(5)
15
>>> triangle_number(4)
10
>>> triangle_number(0)
0
>>> triangle_number(b) + triangle_number(b - 1) - (2 * triangle_number(a - 1))
25

对于 a = 5b = 9,输出如下所示:

    * * * * *
   * * * * * *
  * * * * * * *
 * * * * * * * *
* * * * * * * * *
 * * * * * * * *
  * * * * * * *
   * * * * * *
    * * * * *

并且该公式正确地告诉您必须打印多少颗星:

>>> a, b = 5, 9
>>> triangle_number(b) + triangle_number(b - 1) - (2 * triangle_number(a - 1))
61
>>> """
...     * * * * *
...    * * * * * *
...   * * * * * * *
...  * * * * * * * *
... * * * * * * * * *
...  * * * * * * * *
...   * * * * * * *
...    * * * * * *
...     * * * * *
... """.count('*')
61

您可以通过对b 的三角形公式求和来进一步简化这里的公式;将bb - 1代入公式;当 a 为 1 时,您基本上是在创建一个大小为 b正方形:

(b * (b + 1) // 2) + (b - 1) * b // 2) ==
(b * (b + 1)) + ((b - 1) * b) // 2 ==
(b * (b + b)) // 2 ==
(b * 2 * b) // 2 ==
b * b

a - 1 三角形做同样的事情:

2 * ((a - 1) * a // 2) ==
(a - 1) * a

那么简化的计算是:

total_stars = b * b - (a - 1) * a

这也产生了正确的值:

>>> a, b = 1, 5
>>> b * b - (a - 1) * a
25
>>> a, b = 5, 9
>>> b * b - (a - 1) * a
61

关于python - 计算菱形图案中星星的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273088/

相关文章:

python - scikit-learn:关于 RFECV 示例的问题

python - 如何将列表列表转换为 NumPy 数组并获取完整大小?

Python Selenium Webdriver - 导航嵌套框架集

python-3.x - 如何显示 OpenCV 中检测到的圆总数? (Python)

c# - 如何计算面板的哪个项目被选中

python - 打开 CV 平凡圆检测——如何获得最小二乘法而不是轮廓?

python-3.x - 在 PyPDF2 PdfFileReader 中使用 GCS 路径

Python 3.2 : How do you install easy_install

python - 计算 True 和 False 的有效方法

algorithm - K-means 分割后如何对对象进行计数