Подсчет количества звезд в ромбах - PullRequest
1 голос
/ 07 октября 2019

Я работаю над программой, которая печатает ромбовидный узор на 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 ]

4 голосов
/ 07 октября 2019

Прежде всего, ваш код уже подсчитывает, сколько звезд нужно напечатать в каждом цикле 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 больше единицы, вы в основном оставляете два меньших треугольника, оба из которых имеют высоту 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 в формулы;вы в основном создаете квадрат размером b, когда a равен 1:

(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 голос
/ 07 октября 2019

Если вы определенно хотите использовать метод .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
0 голосов
/ 08 октября 2019

Ответ n * = b² - a² + a был алгебраически выведен в этом ответе , здесь я хотел бы показать наглядное происхождение:тот же результат

enter image description here

...