Skip to main content
 首页 » 编程设计

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

2025年05月04日19mayingbao

我正在开发一个用 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)) 

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

我需要打印图案中的星星总数。但是,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 = 1 和 b = 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 = 5 和 b = 9,输出如下所示:

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

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

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

您可以通过对b 的三角形公式求和来进一步简化这里的公式;将b和b - 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