Функциональное программирование в C с макро-“ генераторами” Функции Высшего порядка

Вам нужно прекратить итерации, если вы знаете, что число не простое. Добавьте break, как только найдете простое число, чтобы выйти из цикла while.

Внесение только минимальных изменений в ваш код, чтобы он работал:

a=2
num=13
while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    break
  i += 1
else: # loop not exited via break
  print('prime')

Ваш алгоритм эквивалентен:

for a in range(a, num):
    if a % num == 0:
        print('not prime')
        break
else: # loop not exited via break
    print('prime')

Если вы добавите его в функцию, вы можете обойтись без break и for-else:

def is_prime(n):
    for i in range(3, n):
        if n % i == 0:
            return False
    return True

Даже если вы собираетесь использовать грубую силу для простого числа, вам нужно всего лишь пройти до квадратного корня из n. Также вы можете пропустить проверку четных чисел после двух.

С этими предложениями:

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

Обратите внимание, что этот код неправильно обрабатывает 0, 1 и отрицательные числа.

Мы упростим это, используя all с выражением генератора для замены цикла for.

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
33
задан a3f 16 April 2015 в 08:19
поделиться

2 ответа

Если вы работаете в Linux / BSD Unix, взгляните на queue (3) и проверьте /usr/include/sys/queue.h - это было сделано раньше :)

12
ответ дан 27 November 2019 в 19:34
поделиться

A recent question raised quite a few shameless preprocessor abusing libraries.

1
ответ дан 27 November 2019 в 19:34
поделиться
Другие вопросы по тегам:

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