我正在编写一个用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()在这种情况下不起作用。
你能建议一种替代的方法吗?
发布于 2019-10-07 16:04:44
首先,您的代码已经计算了它需要在每个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所以你可以在打印的时候把这些数字加起来。
但是你真的不需要计算任何东西,你可以去计算。
您正在构造三角形,因此您可以使用三角形数公式来计算进入三角形的恒星数量。对于由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发布于 2019-10-07 16:17:51
如果您确实想使用.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+ahttps://stackoverflow.com/questions/58273088
复制相似问题