Python - проверка нечетных / четных чисел и изменение выводов на размере числа

Я имею несколько проблем для решения для присвоения и немного застреваю. Вопрос состоит в том, чтобы записать программу, которая добирается, пользователь для ввода нечетного числа (проверьте, что это нечетно), затем распечатайте перевернутую пирамиду звезд на основе размера входа.

Например, если Вы входите 5, это придумывает

*****
 ***
  *

Моя проблема является поэтому двукратной.

1) Как я проверяю, даже ли это или нечетно? Я попробовал if number/2 == int в надежде, что это могло бы сделать что-то, и Интернет говорит мне делать if number%2==0, но это не работает.

2) Как я изменяю звездочки посреди каждой строки?

Любая справка с любой проблемой значительно ценится.

59
задан 30 November 2012 в 03:58

2 ответа

Мое решение в основном, которое мы имеем два, представляет в виде строки и с & мы получаем правильный индекс:

res = ["Even", "Odd"]
print(res[x & 1])

Обратите внимание на то, что это кажется медленнее, чем другие альтернативы:

#!/usr/bin/env python3
import math
import random
from timeit import timeit

res = ["Even", "Odd"]

def foo(x):
    return res[x & 1]

def bar(x):
    if x & 1:
        return "Odd"
    return "Even"

la = lambda x : "Even" if not x % 2 else "Odd"

iter = 10000000

time = timeit('bar(random.randint(1, 1000))', "from __main__ import bar, random", number=iter)
print(time)
time = timeit('la(random.randint(1, 1000))', "from __main__ import la, random", number=iter)
print(time)
time = timeit('foo(random.randint(1, 1000))', "from __main__ import foo, random", number=iter)
print(time)

вывод:
8.05739480999182
8.170479692984372
8.892275177990086

0
ответ дан 1 November 2019 в 11:39

Несколько решений здесь ссылаются на время, потраченное для различного, "даже" операции, конкретно n % 2 по сравнению с n & 1, систематически не проверяя, как это меняется в зависимости от размера n, который оказывается прогнозирующим из скорости.

короткий ответ - это при использовании обоснованно измеренных чисел, обычно < 1e9 , это не имеет большого значения. При использовании большего числа затем, Вы, вероятно, хотите использовать побитовый оператор.

Вот график продемонстрировать то, что продолжается (Python 3.7.3, в соответствии с Linux 5.1.2):

python3.7 benchmark

В основном, поскольку Вы поражаете "произвольную точность" longs, вещи прогрессивно становятся медленнее для модуля, оставаясь постоянными для поразрядного op. Кроме того, отметьте 10**-7 множитель на этом, т.е. Я могу сделать ~30 миллионов (маленькое целое число) проверки в секунду.

Вот тот же график для Python 2.7.16:

python2.7 benchmark

, который показывает оптимизацию, это вошло в более новые версии Python.

я только получил эти версии Python на моей машине, но мог повторно выполниться для других версий существует интерес. Существуют 51 n с между 1 и 1e100 (равномерно расположен с интервалами на логарифмической шкале), для каждой точки, из которой я делаю эквивалент:

timeit('n % 2', f'n={n}', number=niter) 

, где niter вычисляется для создания timeit, занимают ~0.1 секунды, и это повторяется 5 раз. Немного неловкая обработка n должна удостовериться, что мы также не сравниваем поиска глобальной переменной, который медленнее, чем локальные переменные. Средние из этих значений используются для разграничивания, и отдельные значения оттянуты как точки.

1
ответ дан 1 November 2019 в 11:39

Другие вопросы по тегам:

Похожие вопросы: