计算菱形图案中的星星数

时间:2019-10-07 15:52:30

标签: 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()在这种情况下不起作用。

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

3 个答案:

答案 0 :(得分:4)

首先,您的代码已经计算出每个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替换为公式;您基本上是在b为1时创建大小为a square

(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

答案 1 :(得分:1)

如果您确实要使用.count方法,则必须修改一些代码,但这很容易...

>>> a, b = 4, 7    
>>> rows = '\n'.join(' '*abs(i)+'* '*(b-abs(i)) for i in range(a-b, b-a+1))
>>> print(rows)
   * * * * 
  * * * * * 
 * * * * * * 
* * * * * * * 
 * * * * * * 
  * * * * * 
   * * * * 
>>> rows.count('*')
37

要了解其工作原理,可以尝试以下代码段

>>> a = 4
>>> b = 7
>>> [b-abs(i) for i in range(a-b, b-a+1)]
[4, 5, 6, 7, 6, 5, 4]

但是,正如我很久以前写的那样,我认为最简单的主张就是计数您每次将打印多少颗恒星并将其添加到总计数器中,像这样

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

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

答案 2 :(得分:0)

答案 n * =b²-a²+ a 由代数推导in this answer,在这里我想展示同样的图形推导结果

enter image description here