首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算钻石图案中的恒星数

计算钻石图案中的恒星数
EN

Stack Overflow用户
提问于 2019-10-07 15:52:30
回答 2查看 1.9K关注 0票数 1

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

下面是我的代码:

代码语言:javascript
复制
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()在这种情况下不起作用。

你能建议一种替代的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-10-07 16:04:44

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

代码语言:javascript
复制
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行组成的三角形,所需的星星数是:

代码语言:javascript
复制
n x (n + 1)
-----------
    2

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

代码语言:javascript
复制
1.     *
2.    * *
3.   * * *
4.  * * * *
5. * * * * *

在底部还有4个:

代码语言:javascript
复制
4.  * * * *
3.   * * *
2.    * *
1.     *

a大于1时,基本上会留下两个较小的三角形,两个高度都是a - 1。假设a = 3,您忽略了前两行和最后两行:

代码语言:javascript
复制
1.     .       # not printed
2.    . .      # not printed
3.   * * *
4.  * * * *
5. * * * * *
4.  * * * *
3.   * * *
2.    . .      # not printed
1.     .       # not printed

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

这是进行计算的代码:

代码语言:javascript
复制
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 ),则必须删除的星星数:

代码语言:javascript
复制
>>> 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,输出如下所示:

代码语言:javascript
复制
    * * * * *
   * * * * * *
  * * * * * * *
 * * * * * * * *
* * * * * * * * *
 * * * * * * * *
  * * * * * * *
   * * * * * *
    * * * * *

这个公式正确地告诉你要打印多少颗恒星:

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
(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三角形做同样的操作:

代码语言:javascript
复制
2 * ((a - 1) * a // 2) ==
(a - 1) * a

因此,简化的计算是:

代码语言:javascript
复制
total_stars = b * b - (a - 1) * a

这也产生了正确的值:

代码语言:javascript
复制
>>> a, b = 1, 5
>>> b * b - (a - 1) * a
25
>>> a, b = 5, 9
>>> b * b - (a - 1) * a
61
票数 4
EN

Stack Overflow用户

发布于 2019-10-07 16:17:51

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

代码语言:javascript
复制
>>> 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

要了解它是如何工作的,您可以尝试以下代码片段

代码语言:javascript
复制
>>> a = 4
>>> b = 7
>>> [b-abs(i) for i in range(a-b, b-a+1)]
[4, 5, 6, 7, 6, 5, 4]

然而,正如我很久以前写的,我认为最简单的建议是,简单地计算每次要打印多少颗星,然后把它加到一个计数器中,就像这样

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58273088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档