python - избегайте ненужного повторения цикла for - PullRequest
0 голосов
/ 04 февраля 2019

У меня проблема с пониманием того, как избежать повторения #redundant в циклах for.Эта программа намеревается напечатать делители числа в диапазоне от 2 до number:

number = int(input('Enter an integer: '))
for divisor in range (2, number):
    if number % divisor == 0:
        print (divisor)
    else:
        print (number, 'has no divisors in the range')

Хотя это может показаться вам базовым для профессионалов, но я не понимаю, как избежать избыточности.

Ответы [ 5 ]

0 голосов
/ 04 февраля 2019

Сложность range(2, number) равна O(number).

В то время как мы можем оптимизировать то же самое до O(sqrt(number)) следующим образом:

import math

number = int(input('Enter an integer: '))
divisor = 2
have_divisor = False

while divisor <= math.sqrt(number):
    if number % divisor == 0:
        print (divisor)
        print (number/divisor)
        have_divisor = True
    divisor += 1

if not have_divisor:
    print (number, 'has no divisors')

Ссылка: https://www.geeksforgeeks.org/find-divisors-natural-number-set-1/

0 голосов
/ 04 февраля 2019

Я бы предложил сохранить логический флаг, который сообщает вам, нашли ли вы делитель во время цикла или нет.Что-то вроде:

number = int(input('Enter an integer: '))
has_divisors = False
for divisor in range (2, number):
    if number % divisor == 0:
        print (divisor)
        has_divisors = True
if not has_divisors:
    print (number, 'has no divisors in the range')
0 голосов
/ 04 февраля 2019

Оставьте count для делителей и проверьте в конце, равно ли оно нулю.

number = int(input('Enter an integer: '))
count = 0
for divisor in range (2, number):
    if number % divisor == 0:
        print (divisor)
        count += 1
if count == 0:
    print (number, 'has no divisors in the range')
0 голосов
/ 04 февраля 2019

Почему бы просто не сделать list делителей и добавить только, если это так.

number = int(input('Enter an integer: '))
divislbes = []

for divisor in range (2,number):
    if number % divisor == 0:
        divislbes.append(divisor)

print((number, "has no divisors in range.") if not divislbes else "The divisbles of ", number, " are: ", divislbes)

ВЫХОД:

Enter an integer: 5
5 has no divisors in  range.
0 голосов
/ 04 февраля 2019

В этом подходе вам нужна дополнительная переменная, чтобы отслеживать, был ли делитель или нет.Также отступ из вашего блока else должен быть удален.Посмотрите на этот код:

number = int(input('Enter an integer: '))
is_divisor_found = False
for divisor in range(2, number):
    if number % divisor == 0:
        is_divisor_found = True
        print(divisor)
if not is_divisor_found:
    print(number, 'has no divisors in the range')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...